[学习笔记]达内纪录片day12 文件读写函数使用

    选择打赏方式

今天并没有什么难点,主要是文件读写函数的使用方法。


文件操作模板:

#include <stdio.h>
int main(){
	FILE *p_file=fopen("a.txt","w");
	if(!p_file){
	printf("打开文件失败! 程序结束!");
	}
	fclose(p_file);
	p_file=NULL;
	return 0;
}


注意:打开文件后一定要关闭,打开失败就不需要关闭了,否则好像会句柄泄漏。

对于最后这个p_file=NULL,其实并不是必要的,甚至放在这里毫无意义,老师要求的,应该是怕我们用野指针吧,它不会造成内存泄漏、句柄泄漏,只是把一个马上运行结束即将被回收的变量的值置0而已。


一、文件读写实例

演示源码:

#include <stdio.h>
int main(){
	int size=0;
	int arr_w[]={1,2,3,4,5},arr_r[5]={0};
	FILE *p_file=fopen("a.bin","wb");
	if(!p_file){
	printf("打开文件失败! 程序结束!");
	return 0;
	}
	size=fwrite(arr_w,sizeof(int),5,p_file);
	if(size==5)
		printf("写入操作成功完成!\n");
	fclose(p_file);
	//只读方式打开
	p_file=fopen("a.bin","rb");
	if(!p_file){
		printf("打开文件失败! 程序结束!\n");
		return 0;
	}
	size=fread(arr_r,sizeof(int),10/*只会读出文件实际字节的内容*/,p_file);
	if(size==5)
		printf("读入操作成功完成!\n");
	printf("size:%d\n",size);
	for(int i=0;i<size;i++)
		printf("arr_r[%d]=%d\n",i,arr_r[i]);

	fclose(p_file);
	p_file=NULL;
	return 0;
}


运行结果:

TIM截图20190716000859.png


练习 正写倒读:

#include <stdio.h>
int main(){
	int size=0;
	int arr_w[5][5]={0},arr_r[5][5]={0};
	for(int i=0;i<5;i++)
		for(int j=0;j<5;j++)
			arr_w[i][j]=i+1;

	FILE *p_file=fopen("b.bin","wb");
	if(!p_file){
	printf("打开文件失败! 程序结束!");
	return 0;
	}
	size=fwrite(arr_w,sizeof(int),25,p_file);
	if(size==25)
		printf("写入操作成功完成!\n");
	fclose(p_file);
	//只读方式打开
	p_file=fopen("b.bin","rb");
	if(!p_file){
		printf("打开文件失败! 程序结束!\n");
		return 0;
	}
	size=fread(arr_r,sizeof(int),25,p_file);
	if(size==25){
		printf("读入操作成功完成!\n");
	printf("size:%d\n",size);
	for(int i=4;i>=0;i--){
		for(int j=4;j>=0;j--)
			printf("%d ",arr_r[i][j]);
		printf("\n");
	}
	}
	fclose(p_file);
	p_file=NULL;
	return 0;
}


运行结果:

TIM截图20190716002503.png


二、格式化写出(fprintf)与格式化读入(fscanf)

这两个函数与他们的原型函数传递的参数几乎相同,只不过第一个参数是文件指针,第二个参数才是格式控制符。

fprintf返回值:如果成功,则返回写入的字符总数,否则返回一个负数。

fscanf返回值:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

演示源码:

#include <stdio.h>
int main(){
	int arr_w[]={45,913,3,62,152};
	int arr_r[5]={0};
	FILE *p_file=fopen("a.txt","w");
	if(!p_file){
		printf("打开文件失败! 程序结束!\n");
		return 0;
	}
	for(int i=0;i<5;i++)
		fprintf(p_file,"%d ",arr_w[i]);

	fclose(p_file);
	//以只读方式打开
	p_file=fopen("a.txt","r");
	if(!p_file){
		printf("打开文件失败! 程序结束!\n");
		return 0;
	}
	for(int i=0;i<5;i++){
		fscanf(p_file,"%d",&arr_r[i]);
		printf("%d\n",arr_r[i]);
	}
	fclose(p_file);
	return 0;
}

运行结果:

TIM截图20190716203948.png


三、(练习)仿写cp指令复制文件

最开始有点懵逼,直到老师讲了,才想起fread的返回值,可以让它每次读固定字节数,然后写入到创建出来的目标文件,直到有一次,读取的少于我们规定的固定字节数,即可认为只剩下这么多了,已经全部读取完毕了,这时候写入这最后一次的即完成文件复制过程,跳出循环,关闭文件即可。

演示源码:

#include <stdio.h>
int main(int argc,char *argv[]){
	if(argc!=3){
		printf("错误的运行参数! 程序结束!\n");
		return 0;
	}
	FILE *p_f1=fopen(argv[1],"rb");
	if(!p_f1){
		printf("原始文件打开失败! 复制操作未能完成!\n");
		return 0;
	}
	FILE *p_f2=fopen(argv[2],"wb");
	if(!p_f2){
		printf("目标文件打开失败! 复制操作未能完成!\n");
		fclose(p_f1);
		return 0;
	}
	char buf[100]={0};
	int size=0;
	while(1){
		size=fread(buf,sizeof(char),sizeof(buf),p_f1);
		fwrite(buf,sizeof(char),size,p_f2);
		if(size==0)
			break;
	}
	fclose(p_f1);
	fclose(p_f2);
	return 0;
}

运行结果:

TIM截图20190716212210.png


四、文件读写指针移位操作

fopen打开文件后,读写指针默认指向文件开头,fread、fwrite函数默认每读1个,向后移动一段(取决于这2个函数的第2,3两个参数的值)。

除了自动移动指针以外,还可以通过ftell取得当前指针位置,通过fseek函数设置指针相对位置,rewind函数移动到文件开头位置


函数原型:long ftell(FILE *stream);

注意:因为ftell返回long型,根据long型的取值范围-2147483648~2147483647,故对大于2.1G的文件进行操作时出错。


函数原型:int fseek(FILE *stream, long offset, int fromwhere);

说明:如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END)为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

返回值:成功,返回0,失败返回非0值,并设置error的值,可以用perror()函数输出错误。


演示源码:

#include <stdio.h>
int main(){
	char ch=0;
	FILE *p_file=fopen("abc.txt","wb");
	for(int i=65;i<91;i++){
		ch=i;
	fwrite(&ch,sizeof(char),1,p_file);
	}
	fclose(p_file);
	p_file=fopen("abc.txt","rb");
	if(!p_file)
		return 0;
	rewind(p_file);	//fopen后位置指针默认在文件开头位置,无需调用.
	
	fseek(p_file,2,SEEK_SET);
	fread(&ch,sizeof(char),1,p_file);
	printf("ch:%c\n",ch);

	return 0;
}

运行结果:

ch:C


THE END!


版权声明:若无特殊注明,本文皆为《 8964CN 》原创,转载请保留文章出处。
本文链接:[学习笔记]达内纪录片day12 文件读写函数使用 http://www.8964cn.net/?post=73
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!