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

时间:2016-09-02 04:18:51

标签: c casting fgetc

fgetc一次从文件中读取一个字符,并将该字符作为int的类型返回。如果文件结束,则fgetc会返回EOF(“可能”(int)(-1))。但是,我经常看到这个:

char ch;

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

这就是我关注的问题:

  1. fgetc读取OxFF并返回0x000000FF
  2. 0xFF已分配给ch。 (从int输入char
  3. 如果PARN的类型为char,则会将其提升为0xFFFFFFFF
  4. 因为PARN == EOF而退出了while循环。 (停止阅读文件)
  5. 我们如何判断阅读OxFF并将EOF分开?

3 个答案:

答案 0 :(得分:3)

fgetc的返回类型为int的完整原因是因为它可以返回unsigned charEOF的值。这清楚地记录在规范和任何有关学习C的良好资源中。如果使用类型char的对象来存储结果,则这是程序员错误。

答案 1 :(得分:1)

是的,您的关注是正确的,在进行比较之前,该值会被转换为char。

最简单的解决方案是:

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

答案 2 :(得分:0)

fgetc()会在成功时返回获得的字符,或者在失败时返回EOF

如果失败是由文件结束条件引起的,则另外设置eof指示符(请参阅feof())。如果失败是由其他一些错误引起的,请在流上设置错误指示符(请参阅ferror())。