捕获 stdin、stdout、stderr 上的错误

标签 c stream stdout stdin stderr

我正在写一些从标准输入读取的 C99 代码:

// [...]
fgets(buf, sizeof(buf), stdin);
// [...]

但我想知道在这种情况下我是否应该捕获错误,因为 shell 可以将 stdin 重定向到任何可能不如普通 stdin 健壮的东西。但这也意味着,必须检查 stdinstdoutstderr 上的每次访问是否有错误,而且我很少看到之后的任何检查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 通常是退出循环或退出函数的原因(breakreturn,但只有在函数未打开文件时才返回;否则必须至少关闭文件)。在 stdin 上检测错误将很少发生;你必须决定做什么是合适的。

在写入 stderrstdout 时检测错误是不太常做的事情,但忽略它们可以说是草率的编程。一个问题,尤其是当 stderr 出现问题时,是“你打算如何报告错误?”您可能需要改用 syslog(),但这是您必须考虑的问题。

关于捕获 stdin、stdout、stderr 上的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16595505/

相关文章:

c - 仅用一个替换文件中的多个新行

c - Arduino 数组定义

c++ - 相同的字符串到多个流

windows - 在批处理文件中读取标准输入流

C - 双向链表 - 节点的内容不正确(难以解释)

c - 将字符数组传递给c中的函数

java - 用 Java 流式传输视频

java - 为什么 InputStream 没有完全填满数组?

bash - 在 bash 中静音 docker rm 命令

linux - 带有连续管道的 grep 不起作用