根据this post,当std :: cout附加到交互设备(例如终端窗口)时,它将自动刷新\n
。否则(例如,当通过管道传输到文件时)它将完全缓冲,并且只会在.flush()
或std::endl
上刷新。
有没有办法在Microsoft Visual C ++中覆盖此行为,以便我可以选择是否需要完全缓冲或行缓冲模式?
答案 0 :(得分:7)
与anon(2009年4月28日)的回答相反,此行为与操作系统或“控制台软件”无关。
C ++的<iostream>
流旨在与C的<stdio.h>
流互操作。目标是允许std::cout
的使用与printf
/ puts
的使用混合在一起。为实现此目的,std::cout
的{{1}}在C streambuf
流上方实施。当标准输出连接到终端设备时,实际上是C的stdout
是行缓冲的。
您可以调用std::ios_base::sync_with_stdio(false)
(在您的程序使用C ++的任何标准I / O流之前)告诉C ++流库直接与底层文件描述符通信,而不是在C的流库上分层。这完全避免了C的stdout
流,并加速了C ++的I / O流,但代价是两个库不再混合。
另一种方法是通过调用std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ)
无条件地将stdout
设置为完全缓冲。然后,即使stdout
仍在通过std::cout
撰写,您也不会在每个换行符后进行stdout
刷新。
答案 1 :(得分:1)
这不是C ++的问题(没有语言要求可以刷新任何东西),而是使用您的操作系统和/或控制台软件。如果控制台想要在看到换行符时刷新缓冲区,那么它可以,我猜大多数都会这样做。请注意,区分C ++运行时的缓冲区(在某种程度上可以从您的C ++代码控制)和控制台应用程序的缓冲区(无法控制它)是很重要的。
仅供参考,标准iostream库中有一个名为 unitbuf 的标志,如果设置该标志会导致在每次输出操作后刷新缓冲区。例如,它设置为std :: cerr流。这与'\ n'字符无关,因为您可以在一次操作中输出多个'\ n'。
答案 2 :(得分:0)
只要感觉合适,实现就可以自由刷新。它是否因供应商而异,无论它们是否在\n
上刷新。
我可以从C ++ 0x草案中看到名为ios_base& nounitbuf(ios_base& str);
的内容。试一试。这是标准C ++为您提供的唯一内容。