3

最初のコードを実行してすぐに ctrl-c を押す45と、ファイルに書き出されません。しかし、2 番目のコードを実行すると、45.

以下のコードでこの動作が発生する理由がわかりませんでしたか? 行がバッファリングされている場合stdout、文字を入力した後に出力されるべきではありませんか? 私は何が欠けていますか?

最初のコード:

#include<stdio.h>
#include<stdlib.h>
int main()
{
   FILE *fp=stdout;
   fp=fopen("myfile","w");
   fprintf(fp,"%d",45);
   getchar();
  // return 0;

}

2 番目のコード:

#include<stdio.h>
#include<stdlib.h>
int main()
{
   FILE *fp=stdout;
   fprintf(fp,"%d",45);
   getchar();
  // return 0;

}

PS: GCC を使用しており、プラットフォームは Linux です。

4

3 に答える 3

4

getcharはあなたが最初のコードで観察しているバッファリングとは何の関係もないと思います。どの文字も押さずにしばらく待つと(つまり、中に留まるとgetchar())、おそらく空のファイルが表示されます。getcharこれは、プログラムを、sleepまたはで停止したかどうかに関係なく発生しますwhile(1)

ここで、プログラムにハンドラーが登録されていないためにを押すCtrl-Cと、プログラムが突然終了します。プログラムの突然の終了時にバッファ/ストリームがフラッシュされるかどうかは、実装によって定義されます。ここで全文を読む

プロセス終了時にデータがファイルにフラッシュされないのはなぜですか?

たとえば、私のシステム(Windows 7、内部でgccとmingwフレームワークを使用するコードブロック)では、ファイルを突然終了すると、使用や何かに45関係なく、実際にファイルにフラッシュされることがわかります。getcharつまり、私のシステムでは、実装はプログラムの突然の終了時にデータをファイルにフラッシュしています。

つまり、肝心なのは、通常とは異なる方法で物事を行うと、実装が定義されるということです。

しかし、2番目のケースは確かに、バッファをフラッシュしているようにgetchar 見える奇妙なケースです。バッファをフラッシュするstdout理由の正確な原因が見つかったらすぐに更新しますgetcharstdout

于 2012-07-05T07:37:50.717 に答える
0

混乱を引き起こしているのはgetchar()です。呼び出されたときにstdoutをフラッシュしているようです。

getchar()のようなものに置き換えるとsleep(10)、45 は印刷されません。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
   FILE *fp=stdout;
   //fp=fopen("myfile","w");
   fprintf(fp,"%d",45);
   sleep(10);
   //getchar();
  // return 0;

}
于 2012-07-05T07:27:31.827 に答える
-4

物理ファイルに書き込んでいる最初のケース。fopen、fcloseはバッファリングされたI / Oは実装によって異なり、バッファがいっぱいになるまでデータがすぐにコミットされない場合があります。fclose()を呼び出すと、バッファーがディスクに書き込まれます。

STDIOに書き込んでいる2番目のケースと、STDIOに書き込まれたデータは、通常すぐに表示されます。

于 2012-07-05T07:30:28.943 に答える