7

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

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

4

3 回答 3

12

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

C++ 的<iostream>流旨在与 C 的<stdio.h>流互操作。目标是允许std::cout混合使用 of 和printf/ puts。为了实现这一点,std::cout's在 C 的流streambuf之上实现。当标准输出连接到终端设备时,stdout实际上是行缓冲的 C。stdout

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

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

于 2015-12-31T06:40:35.217 回答
1

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

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

于 2009-04-28T08:54:43.300 回答
0

只要觉得合适,实现就可以自由刷新。无论是否刷新,供应商都不同\n

ios_base& nounitbuf(ios_base& str);我可以从我的 C++0x 草稿中看到一些东西。试一试。这是标准 C++ 为您提供的唯一内容。

于 2009-04-28T08:58:24.493 回答