手动刷新cout输出流

4
据我所知,将std::endl流式传输到std::cout会刷新它。我知道这对大多数应用程序都有意义。
我的问题是,我的一些输出使用多个std::endl,因此刷新输出。这对我的程序性能非常不利,也会导致许多图形故障,因为我要频繁跳转。
因此,我的问题是是否可以告诉std::cout等待下一个刷新,直到我显式调用std::cout.flush()或将std::flush流式传输到std::cout
如果可能的话,我还想知道如何反转它,因为它并不总是对我有意义。

1
std::endl 是一个显式调用 std::ostream::flush 并在其后写入换行符的函数。如果您不想让 std::endl 刷新缓冲区,请不要使用 std::endl - David G
2
@0x499602D2 "std::endl是对std::ostream::flush的显式调用,紧接着写入一个换行符" - 相反的是...先换行,然后再刷新。 - Tony Delroy
1个回答

7
请使用std::cout << '\n'代替std::endl,以避免每行后都进行刷新。由于std::endl目的就是进行刷新,因此它将始终执行刷新操作,无法禁用该行为。但是,根本没有必要使用std::endl。最终,由于std::cout的缓冲区是有限的,所以无论您是使用std::endl还是'\n',输出都将在一定程度上被刷新。

如果您想增加标准输出的缓冲区大小,可以尝试增加cout的缓冲区


4
这在一定程度上是有效的,但 cout 是有缓冲区的,当缓冲区填满时它仍会自动刷新。 - AndyG
4
OP只是试图减少刷新以提高性能,他并不需要完全消除它。 - Barmar
1
显然,如果缓冲区填满了,你必须刷新。没有办法避免这种情况。 - b4hand
1
一个过度设计的解决方案可能会先将 cout 重定向到 stringstream 中,然后当用户想要刷新时,撤回该重定向(恢复原始的 streambuf),然后将流的内容传输到 cout 中,并再次进行重定向。 - AndyG
2
@AndyG 这是一个 XY 问题。他解释了他的目标,只是为了避免每行都刷新。他实际上并不需要禁用所有刷新,这只是他错误的假设。 - Barmar
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接