繁体   English   中英

我可以停止在“ \\ n”上刷新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::coutstreambuf 当标准输出连接到终端设备时,实际上是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM