1

我的朋友给了我一个谜语。我运行它。但没有得到预期的输出。代码是:

#include <stdio.h>
#include <unistd.h>
int main()
{
       while(1)
       {
              fprintf(stdout,"hello-out");
              fprintf(stderr,"hello-err");
              sleep(1);
       }
       return 0;
}

输出不打印 hello-out。相反,它会像这样无限地打印:

hello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-errhello-err

然后我尝试这样:

#include <stdio.h>
#include <unistd.h>
int main() 
{
     int i = 0;

     while(i <= 5)
     {
          fprintf(stdout,"hello-out");
          fprintf(stderr,"hello-err");
          sleep(1);
          i++;
     }
     return 0;
}

选择是:

hello-errhello-errhello-errhello-errhello-errhello-errhello-outhello-outhello-outhello-outhello-outhello-out

在 C 语言中,指令是逐行执行的。但为什么它不关注这里?

4

2 回答 2

3

文件 IO 行为由系统决定,如果要保持该顺序,则必须明确fflush。请参阅下面的此程序:

     while(i <= 5)
     {
          fprintf(stdout,"hello-out");
          fflush(stdout);
          fprintf(stderr,"hello-err");
          fflush(stderr);
          sleep(1);
          i++;
     }
于 2013-10-05T10:23:23.673 回答
2

原因是输出缓冲。

默认情况下,stdout是缓冲的:如果它连接到终端,则为行缓冲,否则为完全缓冲。当它是行缓冲时,这意味着在您打印换行符、缓冲区填满或显式刷新缓冲区之前,什么都不会打印。由于您没有打印换行符,因此在程序退出之前不会显示输出,因为此时所有 stdio 缓冲区都已刷新。

stderr另一方面,默认情况下不缓冲。因此,写入它的任何内容都会立即出现。

于 2013-10-05T10:22:53.050 回答