72

fflush()出力ストリームであってもバッファをフラッシュするために使用すべきではありませんか?

それは何に役立ちますか?一般的にバッファをフラッシュするにはどうすればよいですか?

4

1 に答える 1

116

出力バッファのフラッシュ:

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()ため、複数のプロセスの実行の実際の順序を知りたい場合は、印刷のたびにバッファをフラッシュする必要があります。

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


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

ストリームが出力ストリームを指している場合...fflush関数により、そのストリームの未書き込みデータが...ファイルに書き込まれます。それ以外の場合、動作は定義されていません。

一部のシステムでは、Linuxがのマニュアルページにfflush()示されているように、動作が定義されていますが、システムに依存しているため、コードは移植できません。

これで、入力バッファにゴミが「詰まっている」ことが心配な場合は、fpurge()その上で使用できます。詳細については、こちらをご覧くださいfflush()fpurge()

于 2012-09-16T19:43:22.850 に答える