fflush

ストリームをフラッシュします。

構文

int fflush(
   FILE *stream
);

パラメーター

stream
FILE 構造体へのポインター。

戻り値

バッファーが正常にフラッシュされた場合、fflush は 0 を返します。 指定したストリームにバッファーがないか、読み取り専用で開かれる場合にも、値 0 が返されます。 EOF の戻り値はエラーを示します。

Note

fflushEOF を返す場合、書き込みエラーのためにデータが失われることがあります。 重大なエラーのハンドラーを設定する場合、setvbuf 関数でバッファリングを無効にするか、ストリーム I/O 関数ではなく、低レベルの I/O ルーチン (_open_close_write など) を使用することをお勧めします。

解説

fflush 関数はストリーム stream をフラッシュします。 ストリームが書き込みモードで開かれたか、更新モードで開き、最後の操作が書き込みだった場合は、fflushストリーム バッファーの内容を基になるファイルまたはデバイスに書き込み、バッファーが disカードされます。 読み取りモードでストリームを開いた場合、またはストリームにバッファーがない場合、fflush の効果はなく、バッファーが保持されます。 fflush を呼び出すと、ストリームの ungetc に対する以前の呼び出しの効果は無効になります。 呼び出し後もストリームは開いたままになります。

streamNULL の場合、開いている各ストリームで fflush を呼び出した場合と動作が同じになります。 書き込みモードで開いたすべてのストリームと、更新モードで開いて最後の操作が書き込みだったすべてのストリームは、フラッシュされます。 この呼び出しは、他のストリームに影響がありません。

バッファーは通常はオペレーティング システムによって保持され、データをディスクに自動的に書き込むための最適なタイミングが決定されます。タイミングとしては、バッファーがいっぱいになったとき、ストリームが閉じられるとき、プログラムがストリームを閉じずに正常に終了したときがあります。 ランタイム ライブラリのディスクへのコミットの機能を使用すると、重要なデータをオペレーティング システムのバッファーではなく、ディスクに直接書き込むことができます。 プログラムのオブジェクト ファイルを COMMODE.OBJ にリンクすると、既存のプログラムを書き直さずに、この機能を有効にできます。 そのようにした実行可能ファイルでは、_flushall を呼び出すと、すべてのバッファーの内容がディスクに書き込まれます。 _flushallfflush だけが 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

関連項目

ストリーム入出力
fclose, _fcloseall
_flushall
setvbuf