c++ - cout什么时候刷新?

标签 c++ buffer iostream cout

我知道 endl 或调用 flush() 会刷新它。我还知道,当您在 cout 之后调用 cin 时,它也会刷新。以及程序退出时。 cout flush 还有其他情况吗?

我只是写了一个简单的循环,我没有刷新它,但我可以看到它被打印到屏幕上。为什么?谢谢!

for (int i =0; i<399999; i++) {

        cout<<i<<"\n";

}

此外,它完成的时间与 endl 相同,均为 7 秒左右。

for (int i =0; i<399999; i++) {

        cout<<i<<endl;

}

最佳答案

标准没有严格的规则——只有 endl 会刷新,但是实现可以在它“喜欢”的任何时候刷新。

当然,400K 以下的所有数字的总和是 6 * 400K = 2.4MB,这不太可能适合缓冲区,而且循环运行速度足够快,您不会注意到它是否需要每个输出之间有一段时间。尝试这样的事情:

 for(int i = 0; i < 100; i++)
 {
   cout<<i<<"\n";
   Sleep(1000);
 }

(如果您使用的是基于 Unix 的操作系统,请改用 sleep(1) - 或者添加一个需要一些时间的循环等)

编辑:应该注意的是,这不能保证显示出任何差异。我知道在我的 Linux 机器上,如果您在这种特定类型的场景中没有刷新,它不会输出任何内容 - 但是,某些系统可能会执行“flush on\n”或类似的操作。

关于c++ - cout什么时候刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22345226/

相关文章:

c++11返回值优化还是搬家?

c# - 来自 native 应用程序的 CoCreateInstance C# COM 组件找不到引用

C++ 为什么我的代码不打印对给定文件所做的更新

c++ - 给定有向图和商店位置放置商店,以便从任何城市到最近商店的最大距离最小化

video - OpenCV - 是否需要 .clone() 函数来双重缓冲视频源?

c++ - 帮助使用信号量和线程

c++ - 具有混合数据类型的条件运算符?

c++ - 下面的方案如何保证对象 cin、cout、...只有一个定义?

C++ iostream 无法正常工作

c - C 中的缓冲区大小