是否有更多的输出缓冲区?如果是这样,是否endl
只刷新与关联的输出缓冲区cout
?如果只有一个缓冲区,那么是什么让这两个对象cerr
不同clog
?
2 回答
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”,即关闭缓冲。
C(及其起源的 UNIX 环境)中的 I/O 是通过数据“流”完成的,这些数据“流”是可以读取或写入(或两者兼而有之)的抽象字节序列,例如文件系统中的文件或设备,例如终端(或屏幕和键盘。)
C 标准库头文件<stdio.h>
声明了一个类型,该类型FILE
用作数据流的句柄。它还声明了stdin
,stdout
和stderr
,FILE*
分别表示标准输入流、标准输出流和标准错误流。
C++ 标准库定义了可用于std::istream
与std::ostream
数据流交互的类(统称为 iostreams)(术语有点混乱,因为 C++ iostreams 类有时简称为“流”,但同一个词也表示抽象数据<stdio.h>
FILE` 引用的流。)
C++ 全局std::istream
对象std::cin
与标准输入流相关联(即与stdin
所指的流相同),全局std::ostream
对象std::cout
与标准输出流相关联,而全局对象std::cerr
和std::clog
是不同的对象,但都与标准错误流相关联。
cerr
和之间的区别在于clog
,默认情况下clog
使用一个 streambuf 将写入它的字符存储在内部缓冲区中,并且仅在缓冲区填满或显式刷新时将该数据写入标准错误流,而cerr
's streambuf 没有内部缓冲,所以一切都直接写入标准错误流。因为它们是单独的对象,所以它们具有单独的流缓冲区,具有不同的默认行为,但最终写入相同的标准错误流。
std::endl
可以写入任何std::ostream
,因此如果您写入std::cout << std::endl
,它将刷新与 关联的流cout
,这通常是标准输出流。如果您编写std::clog << std::endl
它将刷新与 关联的流clog
,这通常是标准错误流。