stdout行默认是缓冲,无缓冲还是不确定?

时间:2010-09-16 04:46:59

标签: stdout c99 buffered

7.9.13/7的{​​{1}}部分指出:

  

在程序启动时,预定义了三个文本流,无需明确打开 - 标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。 / p>      

最初打开时,标准错误流未完全缓冲;当且仅当可以确定流不参考交互设备时,标准输入和标准输出流是完全缓冲的。

这样才有意义。如果您将标准输出推送到文件,则需要将其完全缓冲以提高效率。

但是,当无法确定设备是非交互式的(即正常输出到终端)时,我在标准中没有提到输出是行缓冲还是无缓冲

我问的原因是对我的回答here的评论,我应该在两个陈述之间插入c99

fflush(stdout);

因为我没有用换行符终止printf ("Enter number> "); // fflush (stdout); needed ? if (fgets (buff, sizeof(buff), stdin) == NULL) { ... } 。任何人都可以解决这个问题吗?

1 个答案:

答案 0 :(得分:29)

C99标准没有指定三个标准流是无缓冲还是行缓冲:由实现决定。我知道所有UNIX实现都有一个缓冲行stdin。在Linux上,stdout行缓冲,stderr无缓冲。

据我所知,POSIX没有施加额外的限制。 POSIX的fflush页面在示例部分中做了注释:

  

[...]使用了 fflush()功能,因为标准输出通常是缓冲的,并且提示可能不会立即打印在输出或终端上。

因此,您添加fflush(stdout);的评论是正确的。


另一种方法是使stdout无缓冲:

setbuf(stdout, NULL);
/* or */
setvbuf(stdout, NULL, _IONBF, 0);

但正如R.注意到你只能这样做一次,而且必须在你写stdout之前或者对它进行任何其他操作之前。 (C99 7.19.5.5 2)


我刚刚在comp.lang.c上阅读了关于同一件事的recent thread。其中一个评论:

  

Unix惯例是stdinstdout在与终端关联时是行缓冲的,否则是完全缓冲的(也就是块缓冲的)。 <{1}}始终是无缓冲的。