0

プログラムにこのコードがあります

while(1){
  // some code here

 fprintf(stdout,"Output Log");
 fprintf(stderr,"Error Log");


 //some code here
      }

「エラーログ」のみ出力します。2 つの fprintf の間でフラッシュするのを見逃していたようです。したがって、文字列「出力ログ」に「\n」を追加しました。うまくいきました。しかし、2つのfprintfを交換したばかりのときのこの奇妙な動作を理解できません

while(1){
  // some code here
 fprintf(stderr,"Error Log\n");
 fprintf(stdout,"Output Log");    

 //some code here
      }

「\n」を使用しているにもかかわらず、「エラーログ」のみが出力されます。

4

3 に答える 3

5

あなたの間違いは、2つのメッセージの「間にある」改行が両方を表示させていると想定していることです。実際には、出力の最後stdoutにある改行がメッセージを表示させていますstdout(メッセージはバッファリングされstderrていないため、常に表示されます)。stderr

いずれにせよ、手動でラインバッファモードをオンに設定しない限り、バッファをフラッシュするために改行に依存することは信頼できませんstdout。line-bufferedはstdout、がターミナルの場合のデフォルトのみです。ラインバッファモードまたは非バッファモードを強制したくない場合は、と への出力の信頼性の高いインターリーブを取得するためにを使用する必要があります。fflushstdoutstderr

于 2013-02-28T07:08:04.657 に答える
1

stderr特別です。アプリケーションの起動時に完全にバッファリングされることはありませstdoutん。これは、ラインバッファリングされるかどうかに関して実装に依存し、まったくバッファリングされない場合があります(ここにあるように)。

それらが同じ出力デバイスにつながれていても違いはありません。あなたがそれについて考えるとき、これは理にかなっています。おそらく、エラーをできるだけ早くフラッシュする必要があります。

于 2013-02-28T07:07:29.903 に答える
1

stdoutバッファリングされているように見えますが、そうでstderrはありません。プログラムが終了することはないため、バッファーがフラッシュされることはありません。

于 2013-02-28T07:07:39.347 に答える