对stdout的默认缓冲区大小感到困惑

时间:2014-05-13 13:15:24

标签: c++ io buffer stdout

#include<iostream>
using namespace std;
int main()
{
    for(int i = 0 ; i < 10; i++)
    {
       printf("1 ");
    }
    while(1);
}

stdout默认使用line buffered吗?如果是这样,我们将在执行上述代码时在控制台上看不到10个1。令我困惑的是:

在带有gcc的Windows系统上:立即打印1

在使用gcc的ubuntu系统上:不打印1

我使用cout<<stdout->_bufsiz来检查Windows上的缓冲区大小,它是0,这是否意味着默认情况下窗口上的标准输出是unbuffered

cout<<stdout->_bufsiz无法在ubuntu上运行,如何获取stdout的缓冲区大小?

当我用while(1);替换getchar();时,会立即在Windows和ubuntu上打印1,为什么? getchar();刷新stdout缓冲区?

感谢。

2 个答案:

答案 0 :(得分:2)

问题是,你的意思是哪个缓冲区?

  1. ostream buffer?
  2. STDOUT文件描述符下的文件流缓冲区?
  3. 在STDOUT碰巧建立的任何设备下面的缓冲区?
  4. 如果是1,我认为你做的是正确的事。

    如果是2,那么你运气不好。看到setbuf()的文档http://man7.org/linux/man-pages/man3/setbuf.3.html,据我所知,没有相同的getbuf。 (有人可以在这里纠正我吗?)

    如果是3,那么我认为你真的不走运。

答案 1 :(得分:1)

在linux上,您可以执行以下操作来刷新缓冲区:

cout << "1 " << "\n";

cout << "1 " << flush;