什么是“cerr”和“stderr”?

时间:2010-07-08 01:32:21

标签: c++ c error-handling stderr

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

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

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

2 个答案:

答案 0 :(得分:41)

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但是很棘手)。该片段将重定向标准输出和标准错误以转到位桶。

答案 1 :(得分:7)

  

他们之间有什么区别

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

  

此外,“屏幕”输出本身就是一个   流吗?

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