setvbuf | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


setvbuf関数

概要

ストリームに、バッファを設定する。

ヘッダ

stdio.h

形式

int setvbuf(FILE* stream, char* buf, int mode, size_t size);

引数

stream

対象のストリーム。

buf

バッファとして使用する配列を指すポインタ。
ヌルポインタを指定した場合は、関数内部で自動的に確保される(setbuf関数の引数buf とは意味が異なることに注意)

mode

バッファリングの形式。_IOFBF_IOLBF_IONBF のいずれかを指定する。

size

バッファの大きさ。

戻り値

成功したら 0、失敗したら 0以外が返される。

詳細

指定ストリームにバッファを設定する。引数mode に指定した値に応じて、3通りのバッファリングが設定できる。

引数buf に配列を指すポインタを指定すると、その配列をバッファ領域として使用する。この配列は、引数size 以上の大きさを持っていなければならない。

引数buf にヌルポインタを指定した場合は、内部でバッファを確保する。その際の大きさは、引数size の値が使われる。また、そのバッファの状態は不定である。

この関数を呼ぶタイミングは、対象のストリームがオープンされてから、そのストリームに対する何らかの操作が実行されるまでの間でなければならない。

なお、ストリームの種類ごとにデフォルトのバッファリング設定がなされているが、これは環境によって異なる。たとえば、標準出力ストリームはバッファリングされており、標準エラーストリームはバッファリングされていないことが多いが、これも環境依存の可能性がある。こういったデフォルトの設定を変更したい場合に、この関数が使用できる。

注意

引数buf に配列を指定した場合は、対象のストリームを使用している間、その配列が存在し続けなけばならない。

使用例

#include <stdio.h>

int main(void)
{
    char stdout_buf[BUFSIZ];


    // ラインバッファリングを行う
    setvbuf(stdout, stdout_buf, _IOLBF, sizeof(stdout_buf));

    char buf[80];
    printf("文字列を入力してください"); // 改行なし
    fgets(buf, sizeof(buf), stdin);
    printf("入力内容:%s\n", buf);


    // バッファリング無しに変更
    setvbuf(stdout, NULL, _IONBF, BUFSIZ);

    printf("文字列を入力してください"); // 改行なし
    fgets(buf, sizeof(buf), stdin);
    printf("入力内容:%s\n", buf);
}

実行結果:

Hello
文字列を入力してください入力内容:Hello

文字列を入力してくださいHello
入力内容:Hello

関連

より単純な setbuf関数がある。

解説章

第43章


参考リンク


更新履歴

’2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。

’2018/4/15 全体的に文章を見直し修正。

’2018/2/22 「サイズ」という表記について表現を統一。 型のサイズ(バイト数)を表しているところは「大きさ」、要素数を表しているところは「要素数」。

’2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る