名前空間
変種
操作

setvbuf

提供: cppreference.com
< c‎ | io
 
 
ファイル入出力
関数
ファイルアクセス
setvbuf
直接入出力
書式なし入出力
(C11以前)(C11およびそれ以降)
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
書式付き入力
書式付き出力
ファイル位置操作
エラー処理
ファイルに対する操作
 
ヘッダ <stdio.h> で定義
int setvbuf( FILE *         stream, char *         buffer,
             int mode, size_t size );
(C99以前)
int setvbuf( FILE *restrict stream, char *restrict buffer,
             int mode, size_t size );
(C99およびそれ以降)

指定されたファイルストリーム stream のバッファリングモードを引数 mode で指定されたように変更します。 さらに、

  • buffer がヌルポインタの場合は、内部バッファのサイズを size に変更します。
  • buffer がヌルポインタでない場合は、 buffer で始まるサイズ size のユーザ定義のバッファを使用するようストリームに指示します。 ストリームは buffer の指す配列の生存期間が終了する前に (fclose で) 閉じなければなりません。 setvbuf の呼び出しが成功した後、配列の内容は不定になり、それを使用する試みは未定義動作です。

目次

[編集] 引数

stream - バッファを設定するファイルストリーム
buffer - 使用するストリームのためのバッファを指すポインタ、またはサイズとモードのみを変更する場合はヌルポインタ
mode - 使用するバッファリングモード。 以下の値のいずれかを指定できます
_IOFBF 完全バッファリング
_IOLBF 行バッファリング
_IONBF バッファリングなし
size - バッファのサイズ

[編集] 戻り値

成功した場合は 0、失敗した場合は非ゼロ。

[編集] ノート

この関数は stream が開いているファイルに紐付けられた後、しかしいかなる他の操作も行われる前 (失敗した setbuf/setvbuf を除く) にのみ、使用することができます。

size バイトのすべてがバッファリングのために使用されるとは限りません。 実際のバッファサイズは通常、2の倍数やページサイズの倍数などに切り捨てられます。

多くの処理系では、行バッファリングは端末入力ストリームに対してのみ利用可能です。

よくある間違いは、 stdin や stdout のバッファをプログラム終了前に生存期間が終了する配列に設定することです。

int main(void) {
    char buf[BUFSIZ];
    setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior

デフォルトのバッファサイズ BUFSIZ は、その処理系におけるファイル入出力のために最も効率的なバッファサイズであることが期待されますが、 POSIX では fstat がしばしばより良い推定値を提供します。

[編集]

バッファサイズを変更するひとつのユースケースは、より良いサイズが判明しているときです。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
 
int main(void)
{
    FILE* fp = fopen("test.txt", "r");
    if(fp == NULL) {
       perror("fopen"); return 1;
    }
 
    struct stat stats;
    if(fstat(fileno(fp), &stats) == -1) { // POSIX only
        perror("fstat"); return 1;
    }
 
    printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize);
    if(setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0) {
       perror("setvbuf failed"); // POSIX version sets errno
       return 1;
    }
 
    int ch;
    while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to
                                  // observe the read(2) syscalls used
 
    fclose(fp);
}

出力例:

BUFSIZ is 8192, but optimal block size is 65536

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.5.6 The setvbuf function (p: 308)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.5.6 The setvbuf function (p: 273-274)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.5.6 The setvbuf function

[編集] 関連項目

ファイルストリーム用のバッファを設定します
Original:
sets the buffer for a file stream
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

(関数) [edit]
{{langlinks|ar|cs|de|en|es|fr|it|ko|pl|pt|ru|tr|zh}