关于cerr cout和clog的问题

时间:2010-03-08 19:48:09

标签: c++ iostream

有人可以解释cerr cout和clog之间的区别以及为什么会提出不同的对象?

我知道差异如下:

1)cout可以重定向,但cerr不能

2)clog可以使用缓冲区。

我对第2点感到困惑,如果有人能详细说明,我很感激。

5 个答案:

答案 0 :(得分:16)

输出可以缓冲或无缓冲。通过缓冲输出,实现可以节省所有输出,直到将其写入磁盘(或任何地方)。这很好用,但是如果程序崩溃了一些输出很可能会丢失。实现必须在发生时将无缓冲的输出写入磁盘,这可能会因为大量磁盘写入而减慢速度,但除非程序在写入时发生崩溃,否则将写入磁盘。

标准输出和标准误差之间没有真正的功能差异;它们只是两个不同的输出流,可以单独重定向。统一链接工具的Unix理念是标准输出将具有适当的输出以进入下一个工具的输入,这几乎要求有一个单独的错误消息流。

因此,cout写入标准输出,并被缓冲。用于正常输出。 cerr写入标准错误流,并且是无缓冲的。用于此错误消息。 clog写入标准错误流,但是被缓冲。这对于执行日志记录非常有用,因为它不会干扰标准输出,但是效率很高(如果程序崩溃,可能会丢失日志的结尾)。

答案 1 :(得分:3)

缓冲输出通常比无缓冲输出快得多。因此,如果您想将大量数据快速写入日志(但不关心它是否实际结束),您将使用clog而不是cerr。

所有流都可以正常重定向,假设一个模糊的操作系统,但这是C ++标准,没有“重定向”这样的概念。

答案 2 :(得分:2)

两者都可以重定向 在大多数实现中,cerr不会被缓冲,不确定这是否是官方的POSIX要求,但是有一个缓冲的错误流是疯狂的。

拥有单独流的原因来自unix哲学,即一个程序的输出是下一个程序的输入。如果'ls'直接进行'排序',那么控制台上出现错误会比写入排序更容易理解输入是错误消息还是要排序的文本的一部分。

答案 3 :(得分:1)

cout-Screen output(stdout)
clog-Buffered output of standard error(stderr)
cerr-Standard error device output (stderr)

答案 4 :(得分:0)

以程序崩溃为例,可以观察到使用缓冲和非缓冲输出的主要原因之一。

考虑将某些内容输出到日志文件中的程序。突然程序崩溃了。你可能会对这一点感兴趣,知道什么错误导致它崩溃,但如果你对所有日志和错误使用了clog(缓冲),你可能看不到所有这些信息,因为当程序崩溃时这些信息可能仍然在缓冲区中因此信息缓冲也丢失了。

因此,如果出现错误,cerr主要用于,因为它是无缓冲的,并且在程序崩溃期间由于它在缓冲区中而导致重大错误丢失时不会出现任何情况。