fflush
ストリームをフラッシュします。
構文
int fflush(
FILE *stream
);
パラメーター
stream
FILE
構造体へのポインター。
戻り値
バッファーが正常にフラッシュされた場合、fflush
は 0 を返します。 指定したストリームにバッファーがないか、読み取り専用で開かれる場合にも、値 0 が返されます。 EOF
の戻り値はエラーを示します。
Note
fflush
が EOF
を返す場合、書き込みエラーのためにデータが失われることがあります。 重大なエラーのハンドラーを設定する場合、setvbuf
関数でバッファリングを無効にするか、ストリーム I/O 関数ではなく、低レベルの I/O ルーチン (_open
、_close
、_write
など) を使用することをお勧めします。
解説
fflush
関数はストリーム stream
をフラッシュします。 ストリームが書き込みモードで開かれたか、更新モードで開き、最後の操作が書き込みであった場合、 fflush
はストリーム バッファーの内容を基になるファイルまたはデバイスに書き込み、バッファーは破棄されます。 読み取りモードでストリームを開いた場合、またはストリームにバッファーがない場合、fflush
の効果はなく、バッファーが保持されます。 fflush
を呼び出すと、ストリームの ungetc
に対する以前の呼び出しの効果は無効になります。 呼び出し後もストリームは開いたままになります。
stream
が NULL
の場合、開いている各ストリームで fflush
を呼び出した場合と動作が同じになります。 書き込みモードで開いたすべてのストリームと、更新モードで開いて最後の操作が書き込みだったすべてのストリームは、フラッシュされます。 この呼び出しは、他のストリームに影響がありません。
バッファーは通常はオペレーティング システムによって保持され、データをディスクに自動的に書き込むための最適なタイミングが決定されます。タイミングとしては、バッファーがいっぱいになったとき、ストリームが閉じられるとき、プログラムがストリームを閉じずに正常に終了したときがあります。 ランタイム ライブラリのディスクへのコミットの機能を使用すると、重要なデータをオペレーティング システムのバッファーではなく、ディスクに直接書き込むことができます。 プログラムのオブジェクト ファイルを COMMODE.OBJ
にリンクすると、既存のプログラムを書き直さずに、この機能を有効にできます。 そのようにした実行可能ファイルでは、_flushall
を呼び出すと、すべてのバッファーの内容がディスクに書き込まれます。 _flushall
と fflush
だけが COMMODE.OBJ
の影響を受けます。
ディスクへのコミットの機能の制御の詳細については、「ストリーム入出力」、fopen
、_fdopen
を参照してください。
この関数は呼び出し元スレッドをロックするため、スレッド セーフです。 ロックしないバージョンについては、「_fflush_nolock
」を参照してください。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
要件
機能 | 必須ヘッダー |
---|---|
fflush |
<stdio.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// crt_fflush.c
// Compile with: cl /W4 crt_fflush.c
// This sample gets a number from the user, then writes it to a file.
// It ensures the write isn't lost on crash by calling fflush.
#include <stdio.h>
int * crash_the_program = 0;
int main(void)
{
FILE * my_file;
errno_t err = fopen_s(&my_file, "myfile.txt", "w");
if (my_file && !err)
{
printf("Write a number: ");
int my_number = 0;
scanf_s("%d", &my_number);
fprintf(my_file, "User selected %d\n", my_number);
// Write data to a file immediately instead of buffering.
fflush(my_file);
if (my_number == 5)
{
// Without using fflush, no data was written to the file
// prior to the crash, so the data is lost.
*crash_the_program = 5;
}
// Normally, fflush is not needed as closing the file will write the buffer.
// Note that files are automatically closed and flushed during normal termination.
fclose(my_file);
}
return 0;
}
5
User selected 5