首先,并非所有 iostream 都被缓冲;缓冲由附加的
streambuf
. 在filebuf
( 由ifstream
and
使用ofstream
) 的情况下,输入将尽可能多地读取,直到缓冲区的大小,并且输出将在溢出时刷新缓冲区,当显式刷新或关闭发生时,或者当对象被破坏时 (隐式调用close)。
的情况cout
有点特殊,因为它永远不会被破坏也不会关闭。系统保证在flush
被调用后至少会调用一次exit
(当你从返回时会发生这种情况main
)。这意味着从 main 返回之前的任何输出都将被刷新;如果你在cout
静态对象的析构函数中使用,你仍然需要明确的刷新来确定。
也可以将tie
输出流转换为输入流;cout
默认情况下绑定到cin
。在这种情况下,任何从绑定流输入的尝试都会刷新输出。
通常的约定是只使用std::endl
而不是简单地输出'\n'
; std::endl
输出 a'\n'
然后刷新流。对于所有输出都迅速出现非常重要的流,unitbuf
可以设置一个标志,这意味着流将在每个<<
运算符结束时刷新。(std::cerr
默认设置了这个。)
最后,如果你想看看缓冲的效果,
sleep(10)
在你的输出后面加上类似的东西。如果它立即出现输出,则它已被刷新;如果不是,则它已被缓冲,并且刷新隐式发生在sleep
.