C++-032-文件读写

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
发布了91 篇原创文章 · 获赞 101 · 访问量 3310

猜你喜欢

转载自blog.csdn.net/weixin_41096569/article/details/104712040