pau*_*doo 3 c++ iostream stdio io-buffering
根据这篇文章, std :: cout会在\n连接到交互式设备(例如终端窗口)时自动刷新.否则(例如,当被管道传输到文件时)它将完全缓冲,并且只会刷新.flush()或std::endl.
有没有办法在Microsoft Visual C++中覆盖此行为,以便我可以选择是否需要完全缓冲或行缓冲模式?
与anon(2009年4月28日)的回答相反,这种行为与操作系统或"控制台软件"无关.
C++的<iostream>流设计为可与C的<stdio.h>流互操作.目标是允许使用std::cout与printf/的使用混合puts.为了实现这一目标,std::cout的streambuf是顶上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' 。