我们经常这样使用fgetc:

int c;
while ((c = fgetc(file)) != EOF)
{
    // do stuff
}

从理论上讲,如果文件中的一个字节具有EOF的值,则此代码有错误-将尽早中断循环并无法处理整个文件。这种情况可能吗?

据我了解,fgetc在内部将从文件读取的字节转换为unsigned char,然后转换为int,并将其返回。如果int的范围大于unsigned char的范围,这将起作用。

如果不是(可能是sizeof(int)=1),会发生什么?
  • 有时候fgetc会从文件中读取与EOF相等的合法数据吗?
  • 是否会更改从文件读取的数据以避免单个值EOF
  • fgetc是未实现的功能吗?
  • EOF是否会是long之类的另一种类型?

  • 我可以通过额外的检查使代码变得万无一失:
    int c;
    for (;;)
    {
        c = fgetc(file);
        if (feof(file))
            break;
        // do stuff
    }
    

    是否需要最大的便携性?

    最佳答案

    是的,c = fgetc(file); if (feof(file))确实可以实现最大的可移植性。它通常适用于unsigned charint具有相同数量的唯一值的情况。这在charsigned charunsigned charshortunsigned shortintunsigned的罕见平台上都使用相同的位宽和范围宽度。

    注意,feof(file))是不够的。代码还应该检查ferror(file)

    int c;
    for (;;)
    {
        c = fgetc(file);
        if (c == EOF) {
          if (feof(file)) break;
          if (ferror(file)) break;
        }
        // do stuff
    }
    

    关于c - 使用fgetc时是否可能将EOF与常规字节值混淆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32641375/

    10-11 17:59