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 言語では、命令は 1 行ずつ実行されます。しかし、なぜここに続いていないのですか?

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 に答える