Section 7.19.3/7
of c99
指出:
在程序启动时,预定义了三个文本流,无需显式打开 - 标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。
最初打开时,标准错误流未完全缓冲;当且仅当可以确定标准输入和标准输出流不引用交互设备时,标准输入和标准输出流才被完全缓冲。
所以这是有道理的。如果您要将标准输出推送到文件,您希望它完全缓冲以提高效率。
但我在标准中找不到关于输出是行缓冲还是无缓冲的提及。can't确定设备是非交互式的(即正常输出到终端)。
我问的原因是对我的答案的评论here https://stackoverflow.com/questions/3723658/does-anyone-have-an-example-of-a-conditional-statement-in-c/3723670#3723670我应该插入一个fflush(stdout);
两个语句之间:
printf ("Enter number> ");
// fflush (stdout); needed ?
if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }
因为我没有终止printf
带换行符。任何人都可以澄清这一点吗?
C99标准没有指定这三个标准流是无缓冲的还是行缓冲的:这取决于实施。我知道的所有 UNIX 实现都有行缓冲stdin
。在 Linux 上,stdout
是行缓冲的并且stderr
无缓冲。
据我所知,POSIX 并没有施加额外的限制。 POSIX 的fflush http://www.opengroup.org/onlinepubs/9699919799/functions/fflush.html页面在示例部分中确实注意到:
[...] 这fflush()使用函数是因为标准输出通常是缓冲的,并且提示可能不会立即打印在输出或终端上。
所以你添加的评论fflush(stdout);
是正确的。
另一种选择可能是stdout
无缓冲:
setbuf(stdout, NULL);
/* or */
setvbuf(stdout, NULL, _IONBF, 0);
但正如 R. 所指出的,您只能执行一次此操作,并且必须在写信给stdout
或对其执行任何其他操作。 (C99 7.19.5.5 2)
我刚刚读了一篇最近的话题 http://groups.google.com/group/comp.lang.c/browse_thread/thread/76f44ab7e8ae3b8d# on comp.lang.c
关于同一件事。备注之一:
Unix 约定是stdin
and stdout
当与终端关联时是行缓冲的,否则是完全缓冲的(也称为块缓冲)。stderr
始终是无缓冲的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)