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) 

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