fgetc():只检查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
。 如果你不在乎你可以跳过对ferror
的呼唤。
这是规格说的:
fgetc()函数应获取下一个字节作为转换为int的unsigned char
以下宏名称应定义为负整数常量表达式:EOF
只要将返回值存储在int
而不是char
,就足以检查EOF
因为它保证不代表有效的字符值。
此外,在您的代码中,这:
while (ch = fgetc(fp) != EOF)
应该:
while ((ch = fgetc(fp)) != EOF)
附加括号是必需的,因为!=
优先级高于=
。