是否有更多输出缓冲区?如果是,endl
是否只刷新与cout
关联的输出缓冲区?如果只有一个缓冲区,那么两个对象cerr
和clog
的区别是什么?
答案 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'
cerr
和clog
之间的唯一区别是clog
默认是缓冲的,而cerr
则不是。您可以使用std::unitbuf
和std::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
,它用作数据流的句柄。它还声明stdin
,stdout
和stderr
类型FILE*
分别引用标准输入流,标准输出流和标准错误流。
C ++标准库定义了std::istream
和std::ostream
类(统称为iostream),它们可用于与数据流交互(术语有点令人困惑,因为C ++ iostreams类有时简称为“streams”,但同一个单词也表示<stdio.h>
FILE`引用的抽象数据流。)
C ++全局std::istream
对象std::cin
与标准输入流相关联(即与stdin
相同的流引用),全局std::ostream
对象{{1 }}与标准输出流相关联,全局对象std::cout
和std::cerr
是不同的对象,但都与标准错误流相关联。
std::clog
和cerr
之间的区别在于默认情况下clog
使用streambuf将存储在其中的字符存储在内部缓冲区中,并且仅将该数据写入标准错误流时缓冲区填满或显式刷新,而clog
的streambuf没有内部缓冲,因此所有内容都直接写入标准错误流。因为它们是单独的对象,所以它们具有单独的streambuf,具有不同的默认行为,但最终会写入相同的标准错误流。
cerr
可以写入任何std::endl
,因此如果您编写std::ostream
,它将刷新与std::cout << std::endl
关联的流,这通常是标准输出流。如果您编写cout
,它将刷新与std::clog << std::endl
关联的流,这通常是标准错误流。