方法一(freopen)
此方法主要是利用freopen将输入、输出重定向到文件中。例如下面的程序从sum.in文件中读取两个整数,计算出两整数之和后输出到sum.out文件中。
//freopen方式读写文件
#include <iostream>
#include <cstdio>
#include <cstdlib>//此行必加,否则linux下可能出问题
using namespace std;
int main()
{
int a,b;
freopen("sum.in","r",stdin); //从sum.in中读取数据
freopen("sum.out","w",stdout);//输出到sum.out文件
cin>>a>>b;
cout<<a+b<<endl;
//system("pause"); 一定要将此句注释掉
return 0;
}
freopen的说明:
只需加入9、10行语句即可很方便地实现读写文件数据的功能。源代码及读写文件名需根据题意严格定义。
方法二(FILE*)
此方法虽然比方法一复杂,但该方法不属于文件重定向语句,且读取速度快,因此在比赛中推荐使用此方法。
//读写文件方法2
#include <iostream>
#include <cstdlib>
int main()
{
int i,len=0,temp[100];
FILE *in=fopen("a.txt","r");//指针指向输入文件
FILE *out=fopen("b.txt","w");//输出文件格式
for(i=0;!feof(in);i++)//如未到文件末尾
{
fscanf(in,"%d",&temp[i]);//读取文件中的数据
len++;
}
for(i=0;i<len-1;i++) //写入文件
fprintf(out,"%d ",temp[i]);
fclose(in);//关闭文件流
fclose(out);//关闭文件流
}
FILE的说明:
每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件名、状态及所在位置等)。这些信息是保存在一个结构体类型的变量中的。该结构类型由系统定义,取名FILE。文件读写完毕后需使用fclose函数关闭文件流。
feof函数的说明:
feof(in)中in是文件指针。它只有两个返回值。当遇到文件结束符(EOF)时返回1,否则返回0。所以第九行中!feof(in)的意思是,若feof(in)未遇到EOF,则一直执行for循环。
fprintf函数和fscanf函数的说明:
fprintf函数和fscanf函数是格式化读写函数,但读写对象为文件。
方法三(fstream)
此方法使用了fstream头文件,推荐C++学习者使用。请看下例:
//读写文件方法3
#include <iostream>
#include<fstream>
using namespace std;
int main()
{
int a,b,c;
ifstream fin("in.txt");
ofstream fout("out.txt");
fin>>a>>b>>c;
fout<<a*b*c<<endl;//注意cin与cout的变化
fin.close();
fout.close();
return 0;
}
读取10万个数据(0≤数据≤399)并重新写入文件速度测试比较如表
读写方法 | freopen | FILE* | fstream |
---|---|---|---|
用时(s) | 0.34 | 0.06 | 0.06 |
内存(kb) | 888 | 616 | 872 |