根据这篇文章\n
,当 std::cout连接到交互式设备(例如终端窗口)时,它会自动刷新。否则(例如,当通过管道传输到文件时)它将完全缓冲,并且只会在.flush()
or上刷新std::endl
。
有没有办法在 Microsoft Visual C++ 中覆盖此行为,以便我可以选择是完全缓冲模式还是行缓冲模式?
根据这篇文章\n
,当 std::cout连接到交互式设备(例如终端窗口)时,它会自动刷新。否则(例如,当通过管道传输到文件时)它将完全缓冲,并且只会在.flush()
or上刷新std::endl
。
有没有办法在 Microsoft Visual C++ 中覆盖此行为,以便我可以选择是完全缓冲模式还是行缓冲模式?
与 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
在每个换行符后刷新。
这不是 C++ 的问题(没有语言要求 \n 刷新任何内容),而是您的操作系统和/或控制台软件。如果控制台想要在看到换行符时刷新其缓冲区,那么它可以,我猜大多数人都会这样做。请注意,区分 C++ 运行时的缓冲区(在某种程度上可以由您的 C++ 代码控制)和控制台应用程序的缓冲区(它无法控制)是很重要的。
仅供参考,标准 iostream 库中有一个名为unitbuf的标志,如果设置该标志,则会在每次输出操作后刷新缓冲区。例如,它是为 std::cerr 流设置的。但是,这与 '\n' 字符无关,因为您可以在单个操作中输出多个 '\n' 。
只要觉得合适,实现就可以自由刷新。无论是否刷新,供应商都不同\n
。
ios_base& nounitbuf(ios_base& str);
我可以从我的 C++0x 草稿中看到一些东西。试一试。这是标准 C++ 为您提供的唯一内容。