setvbuf

入出力用のバッファ (buffer) を設定します.

#include <stdio.h>
int setvbuf(
    FILE * restrict stream,
    char * restrict buf,
    int mode,
    size_t size
);

setvbuf 関数は stream が指すストリームに対して入出力用のバッファを設定します.buf が空ポインタ (NULL) でないときは,buf がバッファとして使用されます.buf が空ポインタのときはバッファ用のメモリ空間が自動的に生成されます.

setvbuf の呼び出しが許されるのは stream の指すストリームがオープン (open) されたファイルに結び付けられてから,そのストリームに対して他の操作が行われるまでの間だけです.

引数

モード

引数 mode に指定できるモードは以下の通りです.

モード意味
_IOFBF入出力を完全バッファリング (fully buffered) する
_IOLBF入出力を行バッファリング (line buffered) する
_IONBF入出力をバッファリングなし (unbuffered) しない

戻り値

  • 成功した場合: 0
  • 失敗した場合: 0以外

C言語サンプルプログラム

setvbuf 関数を使用して標準出力 (standard output) をバッファリングするサンプルプログラムを以下に示します.

/* header files */
#include <stdio.h>
#include <stdlib.h>

/* functions */
void MySleep(int n);

/* main */
int main(void) {
    /* 標準出力を行バッファリングする */
    if ( setvbuf(stdout, NULL, _IOLBF, 256) !=0 ) {
        fprintf(stderr, "Snoopyバッファの設定に失敗しました.\n");
        return EXIT_SUCCESS;
    }

    /* Snoopyの出力 (改行無し) */
    fprintf(stdout, "Snoopy"); /* <-- "Snoopy"がバッファリングされる */

    /* 時間稼ぎ */
    MySleep(100000);

    /* 改行の出力 */
    fprintf(stdout, "\n"); /* <-- この時点で"Snoopy\n"が出力 */


    /* 標準出力をバッファリングしない */
    if ( setvbuf(stdout, NULL, _IONBF, 0) !=0 ) {
        fprintf(stderr, "バッファの設定に失敗しました.\n");
        return EXIT_FAILURE;
    }

    /* Snoopyの出力 (改行無し) */
    fprintf(stdout, "Snoopy"); /* <-- "Snoopy"が直接出力される */

    /* 時間稼ぎ */
    MySleep(100000);

    /* 改行の出力 */
    fprintf(stdout, "\n"); /* <-- "\n"が直接出力される */

    return EXIT_SUCCESS;
}

/* 時間かせぎ */
void MySleep(int n) {
    int i;
    for ( i = 0; i < n * 5000; i++ ); 
}

実行例

サンプルプログラムの実行結果は以下のようになります.

Snoopy
Snoopy

cプログラマの必読書

たくさんあるc言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

c実践プログラミング 第3版

c言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


c言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.