![](/img/trans.png)
[英]How to prevent `std::cin` or `\n` from flushing the buffer of `std::cout`?
[英]Can I stop std::cout flushing on “\n”?
根据这篇文章,当 std :: cout连接到交互式设备(例如终端窗口)时,它将在\\n
上自动刷新。 否则(例如,通过管道传输到文件时)它将完全缓冲,并且仅在.flush()
或std::endl
上.flush()
。
有没有一种方法可以覆盖Microsoft Visual C ++中的此行为,以便可以选择是完全缓冲模式还是行缓冲模式?
与anon(09年4月28日)的答案相反,此行为与操作系统或“控制台软件”无关。
C ++的<iostream>
流被设计为可与C的<stdio.h>
流互操作。 目的是允许将std::cout
使用与printf
/ puts
使用混合在一起。 为此,在C的stdout
流之上实现了std::cout
的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
设置为完全缓冲。 然后,即使std::cout
仍在通过stdout
写入,在每个换行符之后您都不会刷新stdout
。
这不是C ++的问题(没有语言要求\\ n刷新任何东西),但与您的操作系统和/或控制台软件无关。 如果控制台希望在看到换行符时刷新其缓冲区,则可以,并且我想大多数这样做。 请注意,区分C ++运行时的缓冲区(可以在某种程度上由C ++代码控制)和控制台应用程序的缓冲区(不受控制)之间的区别很重要。
仅供参考,在标准iostream库中有一个称为unitbuf的标志,如果设置该标志,则会在每次输出操作后刷新缓冲区。 例如,它是为std :: cerr流设置的。 但是,这与'\\ n'字符无关,因为您可以在单个操作中输出多个'\\ n'。
只要感觉合适,就可以随意刷新实现。 各个供应商是否刷新\\n
有所不同。
我可以看到称为ios_base& nounitbuf(ios_base& str);
东西ios_base& nounitbuf(ios_base& str);
来自我的C ++ 0x草案。 试一试。 这是有关标准C ++给您的唯一内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.