判断文件是否结束时会用到eof,但有的人会把feof也用来进行判定。
被错误使用的feof
在文件读取的过程中,不能用feof函数的返回值来直接进行判断文件的是否结束。
应用于当文件读取结束的时候,判断是读取失败而结束,还是遇到了文件尾而结束。
1. 文本文件结束读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)
例如:
(1)fgetc判断是否为EOF。
#include<stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r"); // 文件放在同一目录中
if (pf == NULL)
return 0;
int ch;
while ((ch = fgetc(pf)) != EOF)
{
putchar(ch);
}
//当while循环结束后进行判断结束的原因
if (ferror(pf))
printf("error"); // 文件读取失败
else if (feof(pf))
printf("end of file"); // 遇到文件结尾
fclose(pf);
pf = NULL;
}
(2)fgets判断返回值是否为NULL。
#include<stdio.h>
int main()
{
char buf[1024] = { 0 };
FILE* pf = fopen("test1.txt", "r");
if (pf == NULL)
return 0;
while (fgets(buf, sizeof(buf), pf) != NULL)
{
printf("%s\n", buf);
}
if (ferror(pf))
printf("error\n");
else if (feof(pf))
printf("end of file\n");
fclose(pf);
pf = NULL;
}
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
#include<stdio.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("test.bin", "wb");
fwrite(a, sizeof(*a), 5, fp); // 写double数组
fclose(fp);
fp = fopen("test.bin", "rb");
// 读double数组
while ((ret_code = fread(&b, sizeof(double), 1, fp)) >= 1)
{
printf("%lf\n", b);
}
if (feof(fp))
printf("end of file\n");
else if (ferror(fp))
printf("error");
fclose(fp);
fp = NULL;
}