[英]fgetc(): Is it enough to just check EOF?
在网络上找到的各种例子中, 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以指示错误。
所以我需要检查一下吗? 如何?
你可以在一段时间之后用ferror(3)检查它:
while (EOF != (ch = fgetc(fp)))
// do something
if (ferror(fp) != 0)
// error handling
如果发生错误,ferror返回非零值。
如果您想在发生错误后使用fp,则需要使用clearerr清除错误标志:
clearerr(fp);
循环直到fgetc
返回EOF
完全没问题。 之后,如果你想知道循环是否由于只是到达文件的末尾或由于错误而结束,你应该调用ferror
或feof
。 如果你不在乎你可以跳过这个电话。
请注意,检查feof
或ferror
是否很重要,因为流的错误指示符是粘性的,即使命中eof是fgetc
失败的原因,也可以评估为true。 通常你应该使用feof
来检查,如果它返回false,则断定循环因新错误而停止。
这是规格说的:
fgetc()函数将获得下一个字节作为转换为int的unsigned char
以下宏名称应定义为负整数常量表达式:EOF
只要将返回值存储在int
而不是char
,就足以检查EOF
因为它保证不代表有效的字符值。
另外,在您的代码中,这个:
while (ch = fgetc(fp) != EOF)
应该:
while ((ch = fgetc(fp)) != EOF)
附加括号是必需的,因为!=
优先级高于=
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.