在调试过程中,经常需要使用文件读入和文件输入,有时还需在文件和窗口间切换读入和输出。
以下总结freopen和ifstrem的用法。
freopen语句
文件读入语句为:
freopen("abc.in","r",stdin);
....
fclose(stdin);
上述语句 freopen("abc.in","r",stdin); 的作用是把标准输入流重定向到一个名为abc.in的文件中,这样在用scanf或是用cin输入时便不会从标准输入流读取数据(也就是不会从C++操作窗口键盘读入数据),而是从abc.in文件中获取输入。
fclose(stdin); 的作用是关闭这个读入文件,也就是abc.in这个文件,这里是从文件的安全性考虑的,用完文件要关闭。
如果想结束文件读入,而改用C++的操作窗口键盘输入数据,使用 fclose(stdin);语句是不对的。因为fclose(stdin);作用则是关闭这个读入文件(也就是文件从可读可写,变成了只可读),所以之后的读入流还是会从这个文件中读入(这里会感觉关了和没关一样,与下边的fclose(stdout);有很大的对比性)。
要想回到C++窗口输入,需要语句:freopen("CON", "r", stdin); con的意思是操作平台,这样修改回标准输入流后,就可以实现窗口的读入了。
文件输出语句为:
freopen("abc.out","w",stdout);
.....
fclose(stdout);
freopen("abc.out","w",stdout); 的作用是把标准输出流重定向到一个名为abc.out的文件中,这样在用printf或是用cout输出时便不会输出到C++操作窗口,而是输出至文件。
fclose(stdout); 的作用是关闭输出文件abc.out。这里关闭了输出文件,那么其可写性也就被关闭了(文件不能再被修改),关闭之后再使用cout等输出,既不会被写入abc.out,也不会输出至C++窗口。
若想使得输出至C++操作窗口,需要语句:freopen("CON", "w", stdout);
注意:
1.文件名称abc.in和abc.out可随意自定义。
2.文件读入和文件输出可以分别单独使用,也可一起用。
3.使用文件读入时要先在源程序根目录下创建读入文件(如abc.in),并输入数据,保存;使用文件输出不用创建输出文件,系统会自动创建。
示例:
#include<iostream>
using namespace std;
int a[100];
int main(){
freopen("abc.in","r",stdin);
freopen("abc.out","w",stdout);
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=n; i>=1; i--)
cout<<a[i]<<" ";
fclose(stdin);
fclose(stdout);
return 0;
}
ifstream和ofstream
用法:
#include<fstream>
ifstream fin; //定义一个输入流
fin.open("a.txt"); //打开a.txt文件
ofstream fout;
fout.open("b.txt");
首先要包含头文件fstream。
ifstream fin; fin.open("a.txt"); 两个语句的意思是新定义一个输入流,并且把这个输入流绑定到a.txt文件上,这样以后只要是使用fin的读入就会从a.txt文件中读取。
ofstream的用法基本一致。
ifstream和ofstream的好处是不修改标准输入输出流,在一个程序中,想用文件读入,那么就可以用自定义的输入流(如fin),想用键盘读入,就用标准输入流cin
。
示例:
#include<iostream>
#include<fstream>
using namespace std;
int a[100];
int main(){
ifstream fin; //定义一个输入流
fin.open("a.txt"); //打开a.txt文件
ofstream fout;
fout.open("b.txt");
int n;
cin>>n;
for(int i=1; i<=n; i++)
fin>>a[i];
for(int i=n; i>=1; i--)
fout<<a[i]<<" ";
return 0;
}
n的读入用的是标准输入流,而a[i]的读入用自定义文件读入fin。