【问题标题】:Confused about the default buffer size of stdout对标准输出的默认缓冲区大小感到困惑
【发布时间】:2014-05-13 13:15:24
【问题描述】:
#include<iostream>
using namespace std;
int main()
{
    for(int i = 0 ; i < 10; i++)
    {
       printf("1 ");
    }
    while(1);
}

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

在带有 gcc 的 windows 系统上:1 会立即打印出来。

在带有 gcc 的 ubuntu 系统上:1 未打印。

我用cout&lt;&lt;stdout-&gt;_bufsiz检查windows上的缓冲区大小,是0,是不是意味着windows上的stdout默认是unbuffered

cout&lt;&lt;stdout-&gt;_bufsiz 在 ubuntu 上不工作,如何获取 stdout 的缓冲区大小?

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

谢谢。

【问题讨论】:

  • 变量stdoutstd::cout无关。 stdout 变量被 printf 等旧 C 函数使用,而 C++ 流使用它们自己的缓冲区。无法获取 C++ 流使用的底层 basic_streambuf 的缓冲区大小。
  • 我把cin换成printf,还是一样的问题。 @JoachimPileborg

标签: c++ io buffer stdout


【解决方案1】:

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

  1. ostream 缓冲区?
  2. STDOUT文件描述符下文件流的缓冲区?
  3. STDOUT 碰巧建立在什么设备上的缓冲区下面?

如果是 1,我认为你在做正确的事情。

如果是 2,那么你就不走运了。据我所知,在此处http://man7.org/linux/man-pages/man3/setbuf.3.html 中查看 setbuf() 的文档,没有等效的 getbuf。 (有人可以在这里纠正我吗?)

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

【讨论】:

  • 我是指调用printf时的标准输出缓冲区
【解决方案2】:

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

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

cout << "1 " << flush;

【讨论】:

  • 没有回答问题
  • 对问题的第一条评论回答它。在这里,我添加了一个针对 Linux 的解决方法。
  • cout&lt;&lt;"\n" 不会刷新缓冲区。 cout&lt;&lt;endl 确实如此。你没有回答我的问题@AMDG
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 2017-09-06
  • 1970-01-01
  • 2018-12-12
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多