7.9.13/7
的{{1}}部分指出:
在程序启动时,预定义了三个文本流,无需明确打开 - 标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。 / p>
最初打开时,标准错误流未完全缓冲;当且仅当可以确定流不参考交互设备时,标准输入和标准输出流是完全缓冲的。
这样才有意义。如果您将标准输出推送到文件,则需要将其完全缓冲以提高效率。
但是,当无法确定设备是非交互式的(即正常输出到终端)时,我在标准中没有提到输出是行缓冲还是无缓冲
我问的原因是对我的回答here的评论,我应该在两个陈述之间插入c99
:
fflush(stdout);
因为我没有用换行符终止printf ("Enter number> ");
// fflush (stdout); needed ?
if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }
。任何人都可以解决这个问题吗?
答案 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惯例是
stdin
和stdout
在与终端关联时是行缓冲的,否则是完全缓冲的(也就是块缓冲的)。 <{1}}始终是无缓冲的。