关于文件结束的判定

在文件的读取过程中,feof函数的返回值不能直接用来判断文件是否结束.正确的用法是当文件读取结束时,判断是读取失败结束,还是遇到了文件尾结束.

判断文本文件的读取是否结束,需要判断其返回值是否为EOF(fgetc),或者NULL(fgets).
也就是说用fgetc获取文件内容时,需要判断是否为EOF(文件结束标志).
用fgets获取文件内容时,需要判断其返回值是否为NULL.

对于二进制文件的读取结束判断,需要判断其返回值是否是一个小于实际要读的个数.即fread判断其返回值是否小于实际要读的个数.

关于文本文件判断结束的例子:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
	int c;
	FILE* fpr = NULL;
	fpr = fopen("C:\\Users\\lenovo\\Desktop\\1.txt", "r");
	if (!fpr){
		perror("File opening failed");	//提示错误原因
		return EXIT_FAILURE;
	}
	//fgetc当读取失败的时候或者遇到文件结束的时候,都会返回EOF
	while ((c = fgetc(fpr)) != EOF){
		putchar(c);
	}
	putchar('\n');
	//判断什么原因结束
	if (ferror(fpr)){	//判断是否因读取失败结束
		// int ferrot(FILE* stream),没有错误返回0,有错返回飞0
		puts("I/O error when reading");
	}
	else if (feof(fpr)){	//判断是否遇到文件尾结束
		puts("End of file reached successfully");
	}
	fclose(fpr);
	fpr = NULL;
	system("pause");
	return 0;
}

关于二进制文件判断结束的例子:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
	double a[5] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
	double b = 0.0;
	size_t ret_code = 0;
	FILE* fp = fopen("C:\\Users\\lenovo\\Desktop\\2.txt", "wb");
	fwrite(a, sizeof(*a), 5, fp);	//写 double 的数组

	fclose(fp);
	fp = NULL;
	fp = fopen("C:\\Users\\lenovo\\Desktop\\2.txt", "rb");
	while ((ret_code = fread(&b, sizeof(double), 1, fp)) >= 1){
		printf("%lf\n", b);
	}
	if (feof(fp)){
		printf("Error reading 2.txt:unexpected end of file\n");
	}
	else if (ferror(fp)){
		perror("Error reading 2.txt");
	}
	fclose(fp);
	fp = NULL;
	system("pause");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值