什么是“cerr”和“stderr”?

Posted

技术标签:

【中文标题】什么是“cerr”和“stderr”?【英文标题】:What are "cerr" and "stderr"? 【发布时间】:2011-03-13 02:56:45 【问题描述】:

它们之间有什么区别以及它们是如何使用的? 谁能指点我的例子?

具体来说,在这两种情况下,您如何“写入”到流中,以及如何恢复和输出(即到屏幕上)已写入其中的文本?

另外,“屏幕”输出本身就是一个流,对吧?也许我对流的理解不够好。当然,这也可以保存到文件中,我知道。所有这些都会使用fprintf/fscanf等吗?

【问题讨论】:

【参考方案1】:

cerr 是 C++ 流,stderr 是 C 文件句柄,都代表标准错误输出。

您写入它们的方式与写入其他流和文件句柄的方式相同:

cerr << "Urk!\n";
fprintf (stderr, "Urk!\n");

我不确定在这种情况下您所说的“恢复”是什么意思,输出进入标准错误,仅此而已。在那之后,该程序并不打算关心它。如果您的意思是如何从程序外部保存它以备后用,请参阅下一段。

默认情况下,它们会转到您的终端,但输出可以重定向到其他地方,例如:

run_my_prog 2>error.out

而且,是的,“屏幕”输出是一个流(或文件句柄),但这通常只是因为 stdout/coutstderr/cerr 默认连接到您的“屏幕”。重定向会影响这一点,如下所示,您的屏幕不会写入任何内容:

run_my_prog >/dev/null 2>&1

(尽管有一些棘手的事情,比如直接写信给/dev/tty)。该 sn-p 会将标准输出和标准错误都重定向到位桶。

【讨论】:

另一个区别是标准错误要么不缓冲(即每次写入时自动刷新)或行缓冲(每次\n 自动刷新),无论它是否指的是交互式设备与否。相比之下,标准输出在(且仅当)它不引用交互式设备时是完全缓冲的。 嗯,从技术上讲,这是 stdout 和 stderr(或 cout 和 cerr)之间的区别,而不是 cerr 和 stderr :-)【参考方案2】:

它们有什么区别

stderrFILE*,是标准 C 库的一部分。 cerrostream,是标准 C++ 库的一部分。

此外,“屏幕”输出本身就是 直播对吗?

是的,是的。但实际上有 两个 流默认写入屏幕:stdout/cout 用于正常输出,stderr/cerr 用于错误消息。这对于重定向很有用:您可以将 stdout 重定向到一个文件,但屏幕上仍然显示错误消息。

【讨论】:

是否可以从std::ostream cerr对象中获取FILE* stderr指针? (类似于cerr.rdbuf()-&gt;bla @alfC:没有标准的方法可以做到这一点。见***.com/questions/109449/…。 是的,我在那里回答了 ***.com/a/19749019/225186 。我认为最优雅的答案是这个:***.com/a/33612982/225186

以上是关于什么是“cerr”和“stderr”?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候应该使用 perror("...") 和 fprintf(stderr, "...")?

何时使用 printf vs fprintf(stderr) [重复]

命令输出(stdout,stderr)未重定向到管道

stdout和stderr标准输出的区别

如何在 C 中打印到 stderr?

exec.Command错误,没有输出到stdout或stderr