是否有更多的输出缓冲区?

时间:2012-06-10 22:55:00

标签: c++ stream iostream

是否有更多输出缓冲区?如果是,endl是否只刷新与cout关联的输出缓冲区?如果只有一个缓冲区,那么两个对象cerrclog的区别是什么?

2 个答案:

答案 0 :(得分:3)

endl刷新您将其流式传输到的流的输出缓冲区。例如:

cout << ... << endl;   // flushes the output buffer of 'cout'
cerr << ... << endl;   // flushes the output buffer of 'cerr'
ofstream file("filename");
file << ... << endl;   // flushes the output buffer of 'file'

cerrclog之间的唯一区别是clog默认是缓冲的,而cerr则不是。您可以使用std::unitbufstd::nounitbuf操纵器为任何流打开或关闭缓冲。例如:

cerr << nounitbuf;   // cerr is now buffered
clog << unitbuf;     // clog is now unbuffered

请注意,“unitbuf”表示“使缓冲区大小为1”,即关闭缓冲。

答案 1 :(得分:3)

C中的I / O(以及它所源自的UNIX环境)是通过数据“流”完成的,数据“流”是可以读取或写入(或两者)的抽象字节序列,例如文件系统中的文件,或者设备,如终端(或屏幕和键盘)。

C标准库头<stdio.h>声明了一个类型FILE,它用作数据流的句柄。它还声明stdinstdoutstderr类型FILE*分别引用标准输入流,标准输出流和标准错误流。

C ++标准库定义了std::istreamstd::ostream类(统称为iostream),它们可用于与数据流交互(术语有点令人困惑,因为C ++ iostreams类有时简称为“streams”,但同一个单词也表示<stdio.h> FILE`引用的抽象数据流。)

C ++全局std::istream对象std::cin与标准输入流相关联(即与stdin相同的流引用),全局std::ostream对象{{1 }}与标准输出流相关联,全局对象std::coutstd::cerr是不同的对象,但都与标准错误流相关联。

std::clogcerr之间的区别在于默认情况下clog使用streambuf将存储在其中的字符存储在内部缓冲区中,并且仅将该数据写入标准错误流时缓冲区填满或显式刷新,而clog的streambuf没有内部缓冲,因此所有内容都直接写入标准错误流。因为它们是单独的对象,所以它们具有单独的streambuf,具有不同的默认行为,但最终会写入相同的标准错误流。

cerr可以写入任何std::endl,因此如果您编写std::ostream,它将刷新与std::cout << std::endl关联的流,这通常是标准输出流。如果您编写cout,它将刷新与std::clog << std::endl关联的流,这通常是标准错误流。