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

pau*_*doo 3 c++ iostream stdio io-buffering

根据这篇文章, std :: cout会在\n连接到交互式设备(例如终端窗口)时自动刷新.否则(例如,当被管道传输到文件时)它将完全缓冲,并且只会刷新.flush()std::endl.

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

Mat*_*ock 7

与anon(2009年4月28日)的回答相反,这种行为与操作系统或"控制台软件"无关.

C++的<iostream>流设计为可与C的<stdio.h>流互操作.目标是允许使用std::coutprintf/的使用混合puts.为了实现这一目标,std::coutstreambuf是顶上C'S实现stdout流.stdout当标准输出连接到终端设备时,实际上C 是行缓冲的.

您可以调用std::ios_base::sync_with_stdio(false)(在程序使用C++的任何标准I/O流之前)告诉C++流库直接与底层文件描述符进行通信,而不是在C的流库上进行分层.这stdout完全避免了C的流,并加速了C++的I/O流,但代价是两个库不再混合.

另一种方法是stdout通过调用无条件地设置为完全缓冲std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ).然后,即使std::cout仍在写作stdout,你也不会stdout在每个换行后都刷新.


小智 1

这不是 C++ 的问题(没有刷新任何内容的语言要求),而是操作系统和/或控制台软件的问题。如果控制台在看到换行符时想要刷新其缓冲区,那么它可以,而且我猜大多数人都会这样做。请注意,区分 C++ 运行时的缓冲区(在某种程度上可以由 C++ 代码控制)和控制台应用程序的缓冲区(它无法控制)非常重要。

仅供参考,标准 iostream 库中有一个名为unitbuf的标志,如果设置该标志,则会导致在每次输出操作后刷新缓冲区。例如,它是为 std::cerr 流设置的。然而,这与 '\n' 字符无关,因为您可以在单个操作中输出多个 '\n' 。

  • 我无权访问 C 标准文档,因此无法发表评论。但是,C++ 标准并未通过引用或其他方式合并 C 标准。C++标准在特定情况下指的是C标准。 (2认同)