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的约定是stdinstdout在与terminal关联时是行缓冲的,而在其他情况下是完全缓冲的(又称为块缓冲)。 stderr总是没有缓冲。