我可以在“\ n”上停止std :: cout刷新吗?

时间:2009-04-28 08:49:29

标签: c++ iostream stdio io-buffering

根据this post,当std :: cout附加到交互设备(例如终端窗口)时,它将自动刷新\n。否则(例如,当通过管道传输到文件时)它将完全缓冲,并且只会在.flush()std::endl上刷新。

有没有办法在Microsoft Visual C ++中覆盖此行为,以便我可以选择是否需要完全缓冲或行缓冲模式?

3 个答案:

答案 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 ++为您提供的唯一内容。