缓冲stdin&标准输出

时间:2016-02-12 09:24:39

标签: c

我有这种简单的代码和平:

#include <stdio.h>

int main()
{
    fprintf(stdout , "stdout \n");
    fprintf(stderr , "stduerr \n");
    return 0;
}

Output:
stdout
stderr

我知道stdout是缓冲的,stderr不是,并知道一个新的冲洗线

Windows和netbeans上的结果是:

stdout
stderr

使用mac和Eclipse的结果:

stderr
stdout

并想知道原因......

非常感谢...

3 个答案:

答案 0 :(得分:1)

stdout默认情况下(在您的系统上)是行缓冲的,这意味着它会在您刷新它时刷新,或者当您放置一个换行符时\#39; \ n&#39;在其中,你在这里做:

fprintf(stdout , "stdout \n");

关于缓冲stdout的更多信息:

  

如果已知stdout不引用交互设备,则表示流   是完全缓冲的。否则,它是依赖于库的   stream默认为行缓冲或不缓冲(请参阅setvbuf)。

Source

答案 1 :(得分:0)

With stdio(3) output streams that refer to terminal devices are line buffered like stdout, while stderr is not buffered.

The program above exits immediately after fprintf, so stdout is flushed then.

If you want to see the differences in behavior, redirect the stdout and stderr to a file, and add a few more fprintf lines.

答案 2 :(得分:0)

正如其他人已经注意到的那样,如果您使用

,您将获得预期的结果
fprintf(stdout, "STDOUT");

fprintf(stderr, "STDERR");

这是因为默认的Linux终端stdout是行缓冲的,而stderr没有缓冲。

您需要刷新标准输出或手动打印&#39; \ n&#39;在打印到stderr之前stdout。然后你会在stderr消息之前看到它。

请注意,也可以关闭stdout的缓冲。