: 関数の使い方がよくわかりませんfflush()
。この関数の適切な実装を見つけることができますか? 私はそれについていくつかのリソースを読みましたが、私はまだそれをよく理解できません.実際に私はこの関数が実際に何をするのか知りたいですか?
5 に答える
引用C11
基準、第 7.21.5.2 章
int fflush(FILE *stream);
stream
最新の操作が入力されていない出力ストリームまたは更新ストリームを指している場合、fflush()
関数は、そのストリームの未書き込みデータをホスト環境に配信してファイルに書き込みます。それ以外の場合、動作は未定義です。
したがって、基本的に、fflush(stream)
呼び出しは強制的にstream
(バッファーがいっぱいでなくても)、特定の出力ファイル(ディスク)に関連付けられたバッファーに存在するすべてのデータをフラッシュします。
また、注として、段落3から、同文書
stream
がヌル ポインターの場合、関数fflush()
は、上で動作が定義されているすべてのストリームに対してこのフラッシュ アクションを実行します。
それが何をするかを知る最良の方法は、標準です
7.21.5.2 fflush 関数
あらすじ
#include <stdio.h> int fflush(FILE *stream);
説明
stream
最新の操作が入力されていない出力ストリームまたは更新ストリームを指している場合、fflush
関数は、そのストリームの未書き込みデータをホスト環境に配信してファイルに書き込みます。それ以外の場合、動作は未定義です。
stream
が null ポインターの場合、関数fflush
は、上で動作が定義されているすべてのストリームに対してこのフラッシュ アクションを実行します。戻り値
- この
fflush
関数は、ストリームのエラー インジケータを設定しEOF
、書き込みエラーが発生した場合は戻り、それ以外の場合はゼロを返します。
したがって、基本的にライブラリ I/O 関数はバッファを使用fflush()
し、データをバッファから物理ファイルに移動します。これが、出力ストリームに対してのみ定義されているfflush(stdin)
ため、上記から理解できるように未定義の動作である理由です。fflush()
上記は、出力ストリームへの書き込み操作がすぐに実行されず、バッファリングされ、呼び出したときにディスクにフラッシュされることを意味します。たとえば、次のように、常に明示的にfflush()
行う必要はありません。fflush()
fpritnf(stdout, "Example text\n");
"\n"
印刷されたテキストの最後に、自動的にフラッシュがトリガーされます。また、プログラムを呼び出したりfclose()
終了したりすると、バッファーがフラッシュされます。
また、出力ストリームの場合でも、最新の操作がoutputでない限り動作が定義されておらず、入力操作をフラッシュできないことに気付くかもしれません。
fflush
FILE
stdio は通常、出力をバッファリングし、大きなチャンクを 1 つの単位として書き込むため、stdio に書き込まれた出力が実際にいつ表示されるかを制御する必要がある場合に必要です。C標準ライブラリ以外のオペレーティングシステムとのインターフェースを使用しない基本的なCプログラムの場合、この種の制御が必要な主な/唯一の時間は、出力が対話型デバイス(画面/端末)に表示されているときです。そこに物理的に表示されていることを確認してください。ただし、UNIX ライク/POSIX システムやマルチプロセッシングを使用するその他の環境では、他のプロセスが読み取る必要のあるファイルまたはパイプにデータを書き出すことも必要になる場合があります。
FILE*
eg fprintf
(またはprintf
which が にほぼ等しい) を使用して に書き込む場合、fprintf(stdout, ...)
通常、データはバッファーに格納されます。バッファーがいっぱいになると、実際の出力ファイルにフラッシュ(書き込み) されます。
バッファーがいっぱいになる前にバッファーの内容をファイルに書き込みたい場合は、それを実行する whichを呼び出すことができますfflush
。