feof函数的使用:不能用feof函数的返回值直接来判断文件是否结束。
feof的作用是:当文件读取结束的时候,判断结束的原因是否是遇到文件尾结束。
判断方法:
文本文件读取是否结束,判断返回值是否是EOF(fgetc),或者NULL(fgets)。
二进制文件的读取结束判断,判断返回值是否小于实际要读的数。
小例:
fgetc读取时返回EOF有两种情况:
1.遇到文件末尾,返回EOF,同时设置一个状态,标志着遇到文件末尾了,使用feof来检测这个状态
2.遇到错误了,返回EOF,同时设置一个状态,标志着遇到错误了,使用feof来检测这个状态。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
int main()
{
char ch;
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(errno);
return;
}
while ((ch = fgetc(pf)) != EOF)
{
putchar(ch);
}
printf("\n");
//判断是什么原因:
if (ferror(pf))
//ferror返回1时,判断为遇到错误。
{
puts("I/O error when reading\n");
}
else if (feof(pf))
//feof返回非空时,判断为遇到文件尾,正常结束。
{
puts("End of file reached successfully\n");
}
fclose(pf);
pf = NULL;
return 0;
}
二进制文件的例子:
enum { SIZE = 5 };
int main()
{
double a[SIZE] = { 1.,2.,3.,4.,5.};
FILE* fp = fopen("test.txt", "wb");//必须用二进制模式
fwrite(a, sizeof * a, SIZE, fp);
fclose(fp);
double b[SIZE];
fp = fopen("test.txt", "rb");
size_t ret_code = fread(b, sizeof * b, SIZE, fp);
if (ret_code == SIZE)
{
puts("Array read successfully contents:");
for (int n = 0; n < SIZE; ++n)
{
printf("%c\n", b[n]);
}
}
else if (feof(fp))
{
printf("Error reading test.txt:unexpected end of file\n");
}
else if (ferror(fp))
{
perror("Error reading test.txt");
}
return 0;
}