有没有办法区分这两种情况中的哪一种导致了错误?
是的,用feof()
和ferror()
来区分。@没事没事
然而,正确使用很重要。考虑两个代码:
char buf[100];
fgets(s, sizeof s, stream);
if (feof(stream)) return "End-of-file occurred";
if (ferror(stream)) return "Input error occurred";
if (fgets(s, sizeof s, stream) == NULL) {
if (feof(stream)) return "End-of-file occurred";
if (ferror(stream)) return "Input error occurred";
return "Should never get here";
}
第二个NULL
根据 OP 的建议正确测试返回值。
第一个可能会遇到一个罕见的问题。测试ferror(stream)
一个标志。此标志可能已由先前的I/O 函数调用设置,stream
因此这fgets()
不一定是错误的原因。最好检查结果,fgets()
看看这个函数是否失败。
如果代码在检测到错误后继续使用stream
,请务必在继续之前清除错误 - 就像尝试重试一样。
if (ferror(stream)) {
clearerr(stream);
return "Input error occurred");
}
请注意,这会clearerr()
清除错误和文件结束标志。
这同样适用于,但大多数代码都是在文件结尾为真时feof()
使用退出的。stream
有第三种病态接收方式NULL
,既不feof()
也不ferror()
返回NULL
,如fgets() 返回 NULL 且符合短缓冲区?. 仔细阅读 C 规范有 3 个“如果”,其中没有一个可能是正确的,因此缺少规范 - 这意味着 UB。