一、代码展示
玩C++游戏的时候可能会有点尴尬,就是玩到所有装备满级时退出,再打开还得重玩,此时天空一声巨响,fstream类闪亮登场,于是我们就可以用文件输入输出了(怎么这么突然……)
以文件版A+B Problem为例:
(原版A+B Problem题目)原版代码:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int a,b,c;
int main() {
cin>>a>>b;
c=a+b;
cout<<c;
return 0;
}
不会有人不会吧? 不会请去重开
文件版代码:
#include <fstream>
using namespace std;
#define LL long long
int main(){
ifstream in;
in.open("in.txt");
int a=0,b=0;
in >> a >> b;
ofstream out;
out.open("out.txt");
out << a + b;
in.close();
out.close();
return 0;
}
虽然感觉fopen和freopen好用一点
二、分析代码
看到ifstream和ofstream了没?这些是文件输入输出需要的类(class),这两个类包含在#include <fstream>里。其中,我个人认为(也不知道是不是)ifstream是i(input)+fstream的组合,ofstream是o(output)+fstream的组合。ifstream的定义方式和普通定义差不多,定义方式为ifstream 变量名;ofstream同理,定义方式为ofstream 变量名;。
那么文件版A+B Problem之中的in.open("in.txt");和out.open("out.txt");是什么意思呢?
首先在编程的时候可能会出现这个:
一般在这个黑色框里的都是此类的成员函数,open也在其中,得出open是ifstream类、ofstream类的成员函数;open是打开的意思,.txt又是文本文档的后缀名,得出结论:
open()函数是用来让ifstream和ofstream定义的对象与存储数据或用来存储数据的文本文档关联的。
此外,在使用open函数关联后,就可以把定义的ifstream类对象当成cin、ofstream类对象当成cout使用啦!例如有如下定义:
ifstream InFile;
ofstream OutFile;
对它实行open关联:
InFile.open("input.txt");
OutFile.open("output.txt");
然后,假设input.txt中有数据8和9,你想把这两个数据读入到a和b中,就可以:
InFile >> a >> b;
同理,如果a=8,b=9,你想把这两个数据写入到output.txt中,就可以:
OutFile << a << " " << b << '\n';
最后我们来说close()。因为和open反义,所以close的作用可得出:
close()是用来与文本文档解除关联的。假设本来InFile与input.txt关联,使用InFile.close()解除关联后,即可让InFile与其他文本文档关联。
上述方法的用途:先将一局的数据写入一个文本文档,因为程序重新运行时文本文档是不会重置的,所以只要第二次再将文本文档的数据读入就好啦!
注意,如果文本文档里已有数据,再次将数据写入后,将会覆盖原数据。如果输出时本来不存在与ofstream关联的对象,那么程序将会创造一个以ofstream关联的对象为名称的文本文档。
再多余地说一句,有一个is_open()函数,会检测文本文档有没有正常打开,打开返回true,否则返回false。
三、补充
这种方法有一个缺陷,就是如果在你使用InFile >> a >> b;的时候,如果在此代码保存的文件夹里不存在input.txt,那么将不会读入。所以,在你运行我的代码的时候,你将会发现在此代码保存的文件夹里有一个output.txt,且里面的数据是0。
解决办法:在第一次运行时在此代码保存的文件夹里创建input.txt并输入数据。这样,程序就可以正常运行了!
文章都看完了,给个赞呗!!