我正在写一些从标准输入读取的 C99 代码:
// [...]
fgets(buf, sizeof(buf), stdin);
// [...]
但我想知道在这种情况下我是否应该捕获错误,因为 shell 可以将 stdin
重定向到任何可能不如普通 stdin
健壮的东西。但这也意味着,必须检查 stdin
、stdout
和 stderr
上的每次访问是否有错误,而且我很少看到之后的任何检查printf
和 co.
那么,是否建议检查每个流访问是否有错误?
上面的例子会是这样的:
// [...]
if (!fgets(buf, sizeof(buf), stdin) && ferror(stdin)) {
exit(EXIT_FAILURE);
}
// [...]
提前致谢!
最佳答案
每次使用时,您都必须检查 fgets()
的返回值。如果不这样做,您就不知道缓冲区中是否有有用的数据;它可以第二次保留最后一行。类似的评论适用于每个读取操作;您必须检查读取操作是否返回了您预期的结果。
if (fgets(buf, sizeof(buf), stdin) == 0)
...EOF, or some error...
在处理代码中,您需要决定要做什么。您可以在该代码中合法地使用 feof()
和 ferror()
。对问题的正确 react 取决于您的代码。检测到 EOF 通常是退出循环或退出函数的原因(break
或 return
,但只有在函数未打开文件时才返回;否则必须至少关闭文件)。在 stdin
上检测错误将很少发生;你必须决定做什么是合适的。
在写入 stderr
或 stdout
时检测错误是不太常做的事情,但忽略它们可以说是草率的编程。一个问题,尤其是当 stderr
出现问题时,是“你打算如何报告错误?”您可能需要改用 syslog()
,但这是您必须考虑的问题。
关于捕获 stdin、stdout、stderr 上的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595505/