2012-09-16 8 views
41

fflush()出力ストリームであってもバッファをフラッシュする必要はありませんか?Cでのバッファのフラッシュ

どのような場合に便利ですか?どのように一般的にバッファをフラッシュするのですか?

+0

の詳細についてhereが、ちょうどそのにfflushのみ出力ストリーム用に明確に定義されている注意してください、それは入力ストリームに対して使用することはできません。それは未定義の動作になります。 – Lundin

+0

@ Lundin出力ストリームをフラッシュするのにそれを使用するのもいいですか? – saadtaame

+2

@saadtaameはい、それはまさに 'fflush()'の目的です。 – Mysticial

答えて

75

出力バッファをフラッシュしないと聞いたことはありません。私はあなたのソースを聞くことに興味があります。出力バッファのフラッシュ:

printf("Buffered, will be flushed"); 
fflush(stdout); // Prints to screen or whatever your standard out is 

または

fprintf(fd, "Buffered, will be flushed"); 
fflush(fd); //Prints to a file 

することは非常に有用な技術であることができます。なぜ出力バッファをフラッシュしたいのですか?通常、私はそれを行うとき、コードがクラッシュしているので、私は何かをデバッグしようとしています。 printf()を呼び出すたびに標準バッファーは印刷されません。バッファーがいっぱいになるまで待ってから一度にダンプします。したがって、クラッシュする前に関数呼び出しを行っているかどうかを確認しようとしている場合は、printfのようなものが役に立つでしょう。また、クラッシュが発生する前にバッファがフラッシュされていないことがあります。あなたが本当にどのくらい離れているかを教えてください。

もう1つの時間は、マルチプロセスまたはマルチスレッドのコードです。繰り返しますが、バッファがprintf()の呼び出しで必ずしもフラッシュするとは限りません。したがって、複数のプロセスの実際の実行順序を知りたい場合は、印刷ごとにバッファをfflushする必要があります。

私はそれを行う習慣を作る、それは私に多くの頭痛をデバッグに保存します。私が考えることができる唯一の欠点は、printf()が高価な操作(デフォルトではバッファをフラッシュしない理由です)です。


は限り入力バッファ(stdin)をフラッシュするとして、あなたはそれを行うべきではありません。フラッシングstdinはC11標準に従って未定義の動作である§7.21.5.2パート2:

出力ストリームにストリームポイントは... fflush関数は、そのストリームのための任意の未書き込みデータが発生した場合...に書き込まれますファイル;それ以外の場合、動作は未定義です。いくつかのシステムでは

は、あなたがfflush()のmanページで見ることができるようにLinuxは一つである、定義された動作がありますが、あなたのコードがポータブルではありませんので、それはシステムに依存します。

ここで、入力バッファに「ゴミが残っている」ことが気になる場合は、fpurge()を使用してください。 fflush()fpurge()

+1

ありがとう! stdin(またはその他のバッファ)はどうですか? – saadtaame

+0

私の編集を参照してください。 – Mike

+0

'fflush(stdin)'を使うことは、VS08/10では間違いなく機能します。それが「明確に定義されている」かどうかはわかりません。私はLinux上ではうまくいかないと確信しているので、VSの "修正"かもしれません。 – ChiefTwoPencils

関連する問題