为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

stdout行默认是缓冲,无缓冲还是不确定?段7.9.13/7的c99规定:在程序启动时,预定义了三个文本流,无需明确打开 - 标准输入(用于读取传统输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。最初打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲。这是有道理的。如果您将标准输出推送到文件,则需要将其完全缓冲以提高效率。但是,当你无法确定设备是非交互式的(即正常输出到终端)时,我在标准中没有提到输出是线路缓冲还是无缓冲。我问的原因是我在这里回答我应该fflush(stdout);在两个陈述之间插入一个:printf ("Enter number> ");// fflush (stdout); needed ?if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }因为我没有printf用换行符终止。任何人都可以清除这个吗?
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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同样的事情。其中一个评论:

Unix约定是,stdinstdout当与终端相关联,和全缓冲(又名块缓冲)否则都行缓冲。stderr总是没有缓冲。


查看完整回答
反对 回复 2019-07-23
  • 1 回答
  • 0 关注
  • 869 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信