stdout行默认情况下缓冲,无缓冲或不确定?
c99
7.9.13/7
节规定:
在程序启动时,三个文本stream是预定义的,不需要明确打开 – 标准input(用于读取常规input),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。
最初打开时,标准错误stream没有被完全缓冲; 标准input和标准输出stream是完全缓冲的,当且仅当stream可以被确定为不涉及交互设备时。
所以这是有道理的。 如果您将标准输出推送到文件中,则需要将其完全缓冲以提高效率。
但是当我们无法确定设备是否是非交互式(即正常输出到terminal)时,在标准中没有提到输出是线路缓冲还是无缓冲。
我问的原因是我的答案在这里 ,我应该插入一个fflush(stdout);
两个陈述之间:
printf ("Enter number> "); // fflush (stdout); needed ? if (fgets (buff, sizeof(buff), stdin) == NULL) { ... }
因为我没有用换行符终止printf
。 任何人都可以清除这个?
C99标准没有规定三个标准stream是否无缓冲或线路缓冲: 这取决于实施。 我所知道的所有UNIX实现都有一行缓冲的stdin
。 在Linux上, stdout
缓冲和stderr
无缓冲。
据我所知,POSIX不会施加额外的限制。 在EXAMPLES部分,POSIX的fflush页面logging:
[…]使用fflush()函数是因为标准输出通常被缓冲,提示可能不会立即打印在输出或terminal上。
所以你添加fflush(stdout);
的说法fflush(stdout);
是正确的。
另一种方法是使stdout
无缓冲:
setbuf(stdout, NULL); /* or */ setvbuf(stdout, NULL, _IONBF, 0);
但是正如R.注意到的,你只能这样做一次,它必须在写入stdout
之前或者在其上执行任何其他的操作。 (C99 7.19.5.5 2)
我刚刚读了关于comp.lang.c
的最近一个线程 。 其中一个评论:
Unix的约定是
stdin
和stdout
在与terminal关联时是行缓冲的,而在其他情况下是完全缓冲的(又称为块缓冲)。stderr
总是没有缓冲。