fgetc():只需检查EOF就够了吗?

时间:2010-11-27 16:52:42

标签: c file-io

在网络fgetc()上找到的各种示例中使用如下:

FILE *fp = fopen(PATH, "r");

if (fp == NULL) {
    perror("main");
    exit(EXIT_FAILURE);
}

int ch;

while (ch = fgetc(fp) != EOF) {
    // do something
}

但根据fgetc()的手册页

  

如果发生读取错误,则表示错误   应设置流的指示符,   fgetc()将返回EOF,[CX]和   应设置errno以指示错误。

所以我需要检查一下吗?怎么样?

3 个答案:

答案 0 :(得分:7)

你可以在一段时间之后用ferror(3)检查它:

while (EOF != (ch = fgetc(fp)))
   // do something

if (ferror(fp) != 0)
   // error handling
如果发生错误,

ferror返回非零值。

如果您想在发生错误后使用fp,则需要清除错误标记:

clearerr(fp);

答案 1 :(得分:6)

循环直到fgetc返回EOF完全没问题。之后,如果您想知道由于只是到达文件末尾或由于错误而导致循环结束,您应该致电ferrorfeof。如果你不在乎,你可以跳过这个电话。

请注意,检查feofferror是否重要,因为流的错误指示符是粘滞的,即使在命中eof导致fgetc失败时也可以评估为true。通常您应该使用feof进行检查,如果返回false,则认为循环因新错误而停止。

答案 2 :(得分:6)

这是规范所说的:

  

fgetc()函数应获取下一个字节作为转换为int

的unsigned char      

以下宏名称应定义为负整数常量表达式:EOF

只要将返回值存储在int而不是char中,只需检查EOF即可,因为它保证不代表有效的字符值。


此外,在您的代码中,这个:

while (ch = fgetc(fp) != EOF)

应该是:

while ((ch = fgetc(fp)) != EOF)

附加括号是必需的,因为!=的优先级高于=