1. ホーム
  2. c

[解決済み] C言語でのバッファのフラッシュ

2022-03-06 08:35:05

質問

必要なもの fflush() は、たとえそれが出力ストリームであっても、バッファをフラッシュするために使用されないのですか?

何に使うのですか?一般的にバッファをフラッシュするにはどうすればよいのでしょうか?

どのように解決するのですか?

出力バッファをフラッシュする。

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 といった感じで、クラッシュが起こる前にバッファがフラッシュされていないことがあり、本当にどこまで到達したのかわからなくなることがあります。

もうひとつ、マルチプロセスやマルチスレッドのコードで役立つことがあります。ここでも、バッファは常に printf() そのため、複数のプロセスの真の実行順序を知りたい場合は、printのたびにバッファをflushする必要があります。

私はこれを習慣にしています。デバッグの際に頭を悩ませることが少なくなりました。そうすることで思いつく唯一の欠点は printf() は高価な操作です(デフォルトでバッファをフラッシュしないのはそのためです)。


入力バッファのフラッシュに関しては、( stdin ) は、やってはいけないことです。フラッシング stdin は、C11標準§7.21.5.2 part 2によると、未定義の動作です。

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

いくつかのシステムで、Linuxはその一つで fflush() 定義された動作がありますが、システムに依存しているので、あなたのコードはポータブルではありません。

もし、入力バッファにゴミが残ってしまうのが心配なら fpurge() を追加しました。 参照 こちら については fflush()fpurge()