检查EOF和fgetc()错误的更好方法是什么?

时间:2015-09-18 07:45:22

标签: c fgetc

我总是使用这种方法

int c;
while ((c = fgetc(fp))!=EOF)
{
    printf("%c", c);
}

在我看来,它更具可读性和强大性。但是对我的回答linkchux评论说

  

if(feof(fp))比...更健壮      int c; while((c = fgetc(fp))!= EOF)

作为

    while(1)
    {
        c = fgetc(fp);
        if ( feof(fp) )
        {
            break ;
        }
        printf("%c", c);
    }

比第一个版本更强大。那么我应该使用什么版本?请解释一下为什么该版本更好。

修改

在问题Why is “while ( !feof (file) )” always wrong?中,有人问为什么控制循环中的feof()总是错误的。但是以正确的方式检查feof()条件是否总是错误的?解释很明显。

2 个答案:

答案 0 :(得分:5)

我通常像这样编写输入循环:

int c;

while (c = fgetc(fp), c != EOF) {
    /* do something with c here */
}

/* check if EOF came from an end-of-file or an error */
if (ferror(fp)) {
    /* error handling here */
}

通常不应该使用这样的循环条件:

while (!feof(fp)) {
    /* do stuff */
}

for (;;) {
    c = fgetc(fp);
    if (feof(fp))
        break;
}

因为遇到IO错误时会中断。在这种情况下,fgetc返回EOF,但未设置文件结束标志。您的代码可能会进入无限循环,因为错误条件通常会持续存在,直到执行外部操作。

正确的方法是检查fgetc()的结果:如果它等于EOF,您通常可以在IO错误和结束时停止读取更多数据在文件条件下,通常无法读取更多数据。然后,您应检查是否发生错误并采取适当的措施。

答案 1 :(得分:1)

建议的改进并不是更好,甚至更不稳健。

如解释here,如果发生读取错误(没有eof),它会进入无限循环。在这种情况下,feof会返回0fgetc会返回EOF

您的版本没有此问题。

此外,您的版本更短,更简单,更标准。