关于文件结束的判定

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

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

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

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

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
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 
#include 
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;
}

你可能感兴趣的:(进阶)