在网络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以指示错误。
所以我需要检查一下吗?怎么样?
答案 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
完全没问题。之后,如果您想知道由于只是到达文件末尾或由于错误而导致循环结束,您应该致电ferror
或feof
。如果你不在乎,你可以跳过这个电话。
请注意,检查feof
或ferror
是否重要,因为流的错误指示符是粘滞的,即使在命中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)
附加括号是必需的,因为!=
的优先级高于=
。