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

标签 c fgetc

<分区>

我一直用这个方法

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

因为在我看来它更具可读性和健壮性。但是对于我的回答link , chux评论说

if ( feof(fp) ) is more robust than 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()总是出错。但是以正确的方式在 if 条件下检查 feof() 总是错误的?解释是可观的。

最佳答案

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

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的情况下错误和文件结束条件,通常无法读取更多数据。然后您应该检查是否发生错误并采取适当的措施。

关于c - 检查 fgetc() 的 EOF 和错误的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32646556/

相关文章:

c - 如何根据从文件读取的字符确定数组的大小?

c - fgetc 空终止符

混淆 == EOF 与 feof

c - 如何使用 read() 和/或 fgetc 获取某些字符串

c - 从文件中读取字符

c - 如何在Linux 3.5.4中从自定义系统调用中调用系统调用

C指针指针问题

c++ - CPP : avoiding macro expansion of a macro function parameter

c - 我是否在我的结构指针上正确地调用了 free() ?

c - fgetc c 的起点