在文件的读取过程中,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;
}