调用 fread()读取数据时,如果返回值小于参数 nmemb 所指定的值,表示发生了错误或者已经到了文件
末尾(文件结束 end-of-file),但 fread()无法具体确定是哪一种情况;在这种情况下,可以通过判断错误标志或 end-of-file 标志来确定具体的情况。
库函数 feof()用于测试参数 stream 所指文件的 end-of-file 标志,如果 end-of-file 标志被设置了,则调用feof()函数将返回一个非零值,如果 end-of-file 标志没有被设置,则返回 0。
其函数原型如下所示:
#include
int feof(FILE *stream);
当文件的读写位置移动到了文件末尾时,end-of-file 标志将会被设置。
if (feof(file))
{
/* 到达文件末尾 */
}
else
{
/* 未到达文件末尾 */
}
库函数 ferror()用于测试参数 stream 所指文件的错误标志,如果错误标志被设置了,则调用 ferror()函数将返回一个非零值,如果错误标志没有被设置,则返回 0。
其函数原型如下所示:
#include
int ferror(FILE *stream);
当对文件的 I/O 操作发生错误时,错误标志将会被设置。
if (ferror(file))
{
/* 发生错误 */
}
else
{
/* 未发生错误 */
}
库函数 clearerr()用于清除 end-of-file 标志和错误标志,当调用 feof()或 ferror()校验这些标志后,通常需要清除这些标志,避免下次校验时使用到的是上一次设置的值,此时可以手动调用 clearerr()函数清除标志。
clearerr()函数原型如下所示:
#include
void clearerr(FILE *stream);
此函数没有返回值,调用将总是会成功!
对于 end-of-file 标志,除了使用 clearerr()显式清除之外,当调用 fseek()成功时也会清除文件的 end-of-file 标志。
clearerr()函数使用示例
#include
#include
int main(void)
{
FILE *fp = NULL;
char buf[20] = {0};
/* 打开文件 */
if (NULL == (fp = fopen("./testApp.c", "r")))
{
perror("fopen error");
exit(-1);
}
printf("文件打开成功!\n");
/* 将读写位置移动到文件末尾 */
if (0 > fseek(fp, 0, SEEK_END))
{
perror("fseek error");
fclose(fp);
exit(-1);
}
/* 读文件 */
if (10 > fread(buf, 1, 10, fp))
{
if (feof(fp))
printf("end-of-file 标志被设置,已到文件末尾!\n");
clearerr(fp); //清除标志
}
/* 关闭文件 */
fclose(fp);
exit(0);
}