fflush

バッファのフラッシュを行う

【書式】
#include <stdio.h>
int fflush(FILE *fp);

【説明】
バッファに格納されているデータを吐き出します。

例えば、scanf関数で"%c"変換指示子を指定した場合には、すでに標準入力がある場合には、入力バッファに残っている'\n'を処理するため、正常な入力が行われません(「5−4.scanf()関数の注意事項」を参照のこと)。このような場合には、fflush(stdin); を実行し、標準入力のバッファフラッシュを行います。(ただし、入力バッファのフラッシュは一般的には未定義です。LSIC-86のようにユーザーズマニュアルに記されている場合のみ使用すべきでしょう。各自確認してください。

また、setbuf関数でユーザバッファを出力バッファに設定した場合などにも、このfflush関数を用いてバッファフラッシュを行わせる必要がある場合があります(処理系依存です。'\n'で出力する場合もあります)。

【引数】
FILE *fp : FILEポインタ

【戻り値】
正常時 : 0
異常時 : EOF

【使用例1】
/* 2度目以降の%c指定を正常に行う(使用できるかどうかは各自確認してください) */
#include        <stdio.h>

int main(void)
{
        char    a;

        printf("文字の入力 ");
        scanf("%c",&a);

        /* fflushを省くと、2回目以降の文字入力が正常に行われません。*/
        printf("文字の入力 ");
        fflush(stdin);
        scanf("%c",&a);

        return 0;
}
【実行結果】
2度続けて文字入力ができる
【使用例2】
/* setbuf関数で出力バッファをユーザバッファに指定した例 (処理系依存)*/
#include <stdio.h>

int main(void)
{
        char buf[BUFSIZ];
        long l;
        
        /* 出力バッファをユーザバッファに指定 */
        setbuf(stdout,buf);
        
        /* 文字列をユーザバッファを使って出力 */
        printf("ABCDEFGHIJKLMN");
        
        /* 出力しない。そのことを確認するために時間稼ぎの空ループ */
        for (l=0; l<1000000000; l++);
        
        /* fflushで初めて出力 */
        fflush(stdout);
        
        return 0;
}
【実行結果】
ABCDEFGHIJKLMN		※しばらくたった後出力

(stdin、stdoutについて)
stdin は「標準入力ストリームポインタ」、stdoutは「標準出力ストリームポインタ」です。

「ストリーム」とは、Cプログラムとファイルを結ぶデータの流れです。ファイルがオープンされると、Cプログラムとファイルとの間にストリームが確立されます。このストリーム上に入力バッファと出力バッファという、緩衝記憶が置かれるのです。つまり、入出力を行うにはファイルオープンによって、このストリームを確立しなければなりません。

Cでは入出力デバイスもファイルとして扱います。しかし、キーボードやスクリーンを、入出力の動作をするためにオープンするのは面倒です。そのため、Cプログラムは実行されると、自動的にオープンする特別なファイルを用意しています。これが、標準ストリームで、オープン時に取得したFILEポインタを下記の「stdin〜stdprn」に格納します。

ストリームポインタ 機能 デバイス
stdin 標準入力 通常はキーボード
stdout 標準出力 通常はスクリーン
stderr 標準エラー出力 通常はスクリーン
stdaux(処理系依存) 標準補助入出力 補助入出力ポート
stdprn(処理系依存) 標準プリンタ出力 プリンタ

getchar、putchar、gets、puts、scanf、printfなどは、この標準入出力に対して入出力を行います。

戻る


banner
初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved