2010-07-08 99 views
25

他们之间有什么区别,他们是如何使用? 任何人都可以指点我的例子吗?什么是“cerr”和“stderr”?

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

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

+8

不需要道歉询问新手问题。 SO是用于所有技能水平的。 – paxdiablo 2010-07-08 01:43:27

回答

32

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

+2

另一个区别在于标准错误不是缓冲(即每次写入时自动刷新),就是行缓存(在每个\ n上自动刷新),无论它是否指向交互式设备。相比之下,如果(并且仅在)它不涉及交互式设备,则标准输出会被完全缓冲。 – 2010-07-08 02:05:02

+2

嗯,从技术上讲,这是stdrr和stderr(或者cout和cerr)之间的区别,而不是cerr和stderr :-) – paxdiablo 2010-07-08 03:52:29

6

它们有什么

stderr之间的差别是FILE*,标准C库的一部分。 cerrostream,是标准C++库的一部分。

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

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

+0

是否可以从std :: ostream cerr对象获得FILE * stderr指针? (类似'cerr.rdbuf() - > bla') – alfC 2013-11-03 05:32:27

+0

@alfC:没有一个标准的方法来做到这一点。请参阅http://stackoverflow.com/questions/109449/getting-a-file-from-a-stdfstream。 – dan04 2016-11-30 22:27:59

+0

是的,我回答了http://stackoverflow.com/a/19749019/225186。我认为最优雅的答案是这样的:http://stackoverflow.com/a/33612982/225186 – alfC 2016-11-30 23:39:49