在文件读取的过程中,feof函数经常被误用来判断文件是否结束。
但其实她是被应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件的结尾而结束
正因为如此feof函数常常与ferror函数配合使用。
feof函数使用cplusplus相关链接:
https://cplusplus.com/reference/cstdio/feof/?kw=feof
具体使用又分为以下两种情况:
1.文本文件读取结束的判断
(1)判断fgetc返回的值是否为EOF
(2)判断fgets返回的值是否为NULL
int main()
{
int a;//int,要求处理EOF
FILE* pf = fopen("test.txt", "r");
if (pf == EOF)
{
perror("open");
return 1;
}
//fgetc失败时返回EOF
while ((a = fgetc(pf)) != EOF)
{
putchar(a);
}
//失败原因判断
if (ferror(pf))
{
printf("读取失败结束\n");
}
else if (feof(pf))
{
printf("遇到文件的结尾而结束\n");
}
fclose(pf);
pf = NULL;
return 0;
}
2. 二进制文件读取结束的判断
判断fread返回值是否小于要读的个数
#define SZ 3
int main()
{
int arr1[SZ] = { 1,2,3 };
FILE* pf = fopen("test.txt", "wb");
fwrite(arr1, sizeof(arr1[0]), SZ, pf);
fclose(pf);
int arr2[SZ];
pf = fopen("test.txt", "rb");
size_t a = fread(arr2, sizeof(arr2[0]), SZ, pf);
if (a == SZ)
{
int i = 0;
for (i = 0; i < SZ; i++)
{
printf("%d ", arr2[i]);
}
printf("\n");
}
else
{
if (ferror(pf))
{
printf("读取失败结束\n");
}
else if (feof(pf))
{
printf("遇到文件的结尾而结束\n");
}
}
fclose(pf);
pf = NULL;
return 0;
}
总之,feof函数只是用来判断遇到文件尾结束,判断失败的原因还得交给ferror函数。
用feof函数的返回值来判断文件是否结束更是一个错误。