什么是“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/cout
和 stderr/cerr
默认连接到您的“屏幕”。重定向会影响这一点,如下所示,您的屏幕不会写入任何内容:
run_my_prog >/dev/null 2>&1
(尽管有一些棘手的事情,比如直接写信给/dev/tty
)。该 sn-p 会将标准输出和标准错误都重定向到位桶。
【讨论】:
另一个区别是标准错误要么不缓冲(即每次写入时自动刷新)或行缓冲(每次\n
自动刷新),无论它是否指的是交互式设备与否。相比之下,标准输出在(且仅当)它不引用交互式设备时是完全缓冲的。
嗯,从技术上讲,这是 stdout 和 stderr(或 cout 和 cerr)之间的区别,而不是 cerr 和 stderr :-)【参考方案2】:
它们有什么区别
stderr
是 FILE*
,是标准 C 库的一部分。 cerr
是 ostream
,是标准 C++ 库的一部分。
此外,“屏幕”输出本身就是 直播对吗?
是的,是的。但实际上有 两个 流默认写入屏幕:stdout
/cout
用于正常输出,stderr
/cerr
用于错误消息。这对于重定向很有用:您可以将 stdout
重定向到一个文件,但屏幕上仍然显示错误消息。
【讨论】:
是否可以从std::ostream cerr
对象中获取FILE* stderr
指针? (类似于cerr.rdbuf()->bla
)
@alfC:没有标准的方法可以做到这一点。见***.com/questions/109449/…。
是的,我在那里回答了 ***.com/a/19749019/225186 。我认为最优雅的答案是这个:***.com/a/33612982/225186以上是关于什么是“cerr”和“stderr”?的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该使用 perror("...") 和 fprintf(stderr, "...")?