繁体   English   中英

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

[英]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完全没问题。 之后,如果你想知道循环是否由于只是到达文件的末尾或由于错误而结束,你应该调用ferrorfeof 如果你不在乎你可以跳过这个电话。

请注意,检查feofferror是否很重要,因为流的错误指示符是粘性的,即使命中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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM