文件读写

方法一(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
posted @ 2017-05-16 16:48  STEMJ_GO  阅读(121)  评论(0)    收藏  举报