【问题标题】:What will happen if fgetc reads 0xFF? [duplicate]如果 fgetc 读取 0xFF 会发生什么? [复制]
【发布时间】:2016-09-02 04:18:50
【问题描述】:

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 循环。 (停止从文件中读取)

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

【问题讨论】:

  • 这就是您声明ch 的类型为int 而不是char 的原因。
  • 那么你的代码就崩溃了。
  • 大多数情况下,人们将ch 声明为char。
  • @KevinDong:那是错误的。不要这样做。

标签: c casting fgetc


【解决方案1】:

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

【讨论】:

  • 我明白了。当我在其他thread看到这样的代码时,我认为它是错误的,所以我在这里询问并检查它是否正确。非常感谢。 ;-)
【解决方案2】:

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

最简单的解决方案是:

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

【讨论】:

  • 感谢您的解决方案。 ;-)
【解决方案3】:

fgetc() 成功返回获取的字符,失败返回EOF。

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

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2012-04-24
    相关资源
    最近更新 更多