1

是否有更多的输出缓冲区?如果是这样,是否endl只刷新与关联的输出缓冲区cout?如果只有一个缓冲区,那么是什么让这两个对象cerr不同clog

4

2 回答 2

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和之间的唯一区别clogclog默认情况下是缓冲的,而cerr不是。std::unitbuf您可以使用和std::nounitbuf操纵器为任何流打开或关闭缓冲。例如:

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

注意“unitbuf”的意思是“使缓冲区大小为1”,即关闭缓冲。

于 2012-06-10T23:02:51.767 回答
3

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

C 标准库头文件<stdio.h>声明了一个类型,该类型FILE用作数据流的句柄。它还声明了stdin,stdoutstderrFILE*分别表示标准输入流、标准输出流和标准错误流。

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

C++ 全局std::istream对象std::cin与标准输入流相关联(即与stdin所指的流相同),全局std::ostream对象std::cout与标准输出流相关联,而全局对象std::cerrstd::clog是不同的对象,但都与标准错误流相关联。

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

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

于 2012-06-10T23:51:13.793 回答