setvbuf

モード指定による入出力バッファの設定

【書式】
#include <stdio.h>
int setvbuf(FILE *fp, char *buf, int mode, size_t size);

【説明】
setbuf関数を用いると、自動的に割り当てられる入出力バッファの代わりに、bufで指定した領域を使うことができますが、setvbuf関数では更にモードによりバッファリング形式とバッファのサイズの指定ができます。
また、bufに「NULL」を指定すると、mallocを使って自動的にバッファをsize分確保します。このエリアはfpをクローズすると自動的に解放されます。
setbuf関数は、setvbuf(fp, buf, _IOFBF, BUFSIZ); と同じことです。
 setbuf関数はfpをオープン直後かfseekをした直後に用いないと思わぬエラーの原因になるようです。

【引数】
FILE *fp  : FILEポインタ
char *buf : バッファの格納先
int mode  : バッファリング形式(動作は処理系依存なので、各自確認してください。)
   _IOFBF 入出力をフルバッファリング
        (バッファが空の場合は次の入力操作でバッファを満たそうとします。
         バッファフルになるまで、ファイルにデータを書き込まれません。)
   _IOLBF 入出力を行バッファリング
        (バッファが空の場合は次の入力操作でバッファを満たそうとします。
         改行文字が書かれる度にフラッシュされます。)
   _IONBF 入出力をバッファリングしない
        ( bufと size を無視し、入力操作が行われる度にファイルから直接読み込み、
         直ちにファイルに書き込まれます。)
size_t size : バッファの大きさ

【戻り値】
正常時 : =0
異常時 : ≠0

【使用例】
#include <stdio.h>

int main(void)
{
        char buf[20];
        long l;
        
        /* 出力バッファをユーザバッファに行バッファリングで指定 */
        setvbuf(stdout,buf,_IOLBF,sizeof(buf));
        
        /* 文字列をユーザバッファを使って出力 */
        printf("1234567890");
        
        /* 文字サイズがsize以下なので出力しない。
        そのことを確認するために時間稼ぎの空ループ */
        for (l=0; l<1000000000; l++);
        
        /* '\n'で出力 */
        printf("\n");
        
        return 0;
}
【実行結果】
1234567890 ・・・ 即座に出力せず空ループ終了後に出力

戻る


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