如果 fgetc 读取 0xFF 会发生什么?

What will happen if fgetc reads 0xFF?

fgetc 一次从文件中读取一个字符,returns 字符类型为 int。如果文件结束,则 fgetc returns EOF ("probably" (int)(-1))。但是,我经常看到这个:

char ch;

while ((ch = fgetc(fp)) != EOF)  {  /* Do something. */  }
       |<--  PARN  -->|

这是我关心的:

  1. fgetc 读作 OxFF 和 returns 0x000000FF.
  2. 0xFF 分配给 ch。 (从 intchar 的类型转换)
  3. 如果PARNchar的类型,那么它将被提升为0xFFFFFFFF
  4. 由于PARN == EOF,中断了 while 循环。 (停止读取文件)

我们如何区分阅读 OxFF 和返回 EOF

fgetc 的 return 类型是 int 的全部原因是因为它可以 return 一个 unsigned char 的值,或者 EOF。这在规范和学习 C 的任何好的资源中都有明确记录。如果您使用 char 类型的对象来存储结果,这是程序员错误。

是的,您的担心是正确的,即在进行比较之前,值被类型转换为 char。

最简单的解决方案是:

int chread;
while ((chread = fgetc(fp)) != EOF) { char ch = chread; /* Do something. */ }

fgetc() returns成功获得的角色或EOF失败。

如果失败是由文件结束条件引起的,则在流上额外设置 eof 指示符(参见 feof()) on stream. If the failure has been caused by some other error, sets the error indicator (seeferror() )。