C+±032-文件读写-2020-3-7
方法一(freopen)
//freopen方式读写文件
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main()
{
int a,b;
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
cin>>a>>b;
cout<<a+b<<endl;
fclose(in);//关闭文件流
fclose(out);//关闭文件流
}
//sum.in和 sum.out在exe同个文件中
sum.in
1 2
sum.out //执行后
3
方法二(FILE*)
//FILE* fopen方法读写文件
#include<iostream>
#include<cstdlib>
#include<cstdio>
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);//关闭文件流
}
a.txt
1 2 3 4 5 6 7
b.txt//执行后
1234567
FILE的说明:每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体类型的变量中的。该结构体类型有系统定义,取名为FILE。文件读写完毕后需使用fclose函数关闭文件流。
feof函数的说明:feof(in)中in是文件指针。它只有两个返回值。当遇到文件结束符(EOF)时返回1,否则返回0。使用第9行中!feof(in)的意思是,若feof(in)未遇到EOF,则一直执行for循环。
fprintf函数和fscanf函数的说明:fprintf函数和fscanf函数是格式化读写函数,但读写对象为文件。
方法三(fstream)
//fstream
#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;
fin.close();
fout.close();
return 0;
}
in.txt
2 3 4
out.txt//执行后
24
方法四(fread函数)
fread函数模型:size_tfread(void * buffer,size_tsize,size_tcount,FILE*in);
(1)buffer:用于接受数据的地址(指针)。
(2)size:单个元素的大小。单位是字节而不是位。
(3)count:元素个数。
(4)in:提供数据的文件指针。
(5)返回值:读取的元素的个数。
如下:
//fread读取文件1
#include<iostream>
#include<cstdlib>
#include<cstdio>
char a[1100000];
int main()
{
FILE*in=fopen("a.in","rb");
FILE*out=fopen("a.out","w");
int n=fread(a,1,1100000,in);
for(int i=0;i<n;i++)
fprintf(out,"%c",a[i]);
return 0;
}
a.in
1 2 3 4
a.out//执行后
1 2 3 4
fread()是按照char类型读取的,因此当读取的数据类型位数值时,需要再次转化为数值。参考程序
如下:
//fread读取文件2
#include<iostream>
#include<cstdio>
using namespace std;
FILE * in=fopen("i.txt","rb");
int mark=0;
char a[10];
int getnum()//将char类型转换为int类型
{
int obj=0;
while(!(a[mark]>='0'&&a[mark]<='9'))
mark ++;
while(a[mark]>='0'&&a[mark]<='9')
obj=obj*10+a[mark++]-'0';
return obj;
}
int main()
{
freopen("p.txt","w",stdout);//文件输出
int s=1,i;
fread(a,6,1,in);//第二、三个参数依据数组大小而定,够用就好
for(i=0;i<3;i++)
s*=getnum();
cout<<s<<endl;
return 0;
}
i.txt
1 2 3 4 5
p.txt//执行后
6
需要注意的是,无论何种文件读写方法,最后一行万万不可写getchar()或system(“pause”)之类的语句,因为这类语句是在等待用户再输入一个字符。而文件读写形式的程序,是不需要暂停的。
四种文件读写方法的比较如表
读写方法 | freopen | FILE* | fstream | fread |
---|---|---|---|---|
读写速度 | <iostream> 下使用cin和cout这些标准输入输出流速度会慢;<stdio.h> 下使用fscanf和fprintf这些专门读写文件的函数速度会快。 |
C语言专用。速度会快。 | C++专用。速度快。 | 堪称最精确最快的读文件方式之一。精确到连空格都可以读。因为它是整个文件读所有速度快。 |
占用内存 | 前者较大,后者较小 | 较小 | 较大 | 较大 |
读取10万个数据(0<=数据<=399)并重新写入文件的测试比较如表
读写方法 | freopen | FILE* | fstream | fread |
---|---|---|---|---|
用时 | 前者0.34 后者0.06 | 0.06 | 0.06 | 0.06 |
内存(KB) | 前者888 后者616 | 616 | 872 | 1300 |