Namespaces
Variants

setvbuf

From cppreference.net
< c ‎ | io
ヘッダーで定義 <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から)
#define _IOFBF     /*unspecified*/

#define _IOLBF     /*unspecified*/

#define _IONBF     /*unspecified*/

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

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

目次

パラメータ

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

戻り値

0 成功時は0、失敗時は0以外の値を返します。

注記

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

すべての size バイトが必ずしもバッファリングに使用されるわけではありません:実際のバッファサイズは通常、2の倍数、ページサイズの倍数などに切り下げられます。

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

よくあるエラーは、stdinまたはstdoutのバッファを、プログラム終了前に寿命が切れる配列に設定することです:

int main(void) {
    char buf[BUFSIZ];
    setbuf(stdin, buf);
} // bufの寿命が終了、未定義動作

デフォルトのバッファサイズ BUFSIZ は、その実装におけるファイルI/Oで最も効率的なバッファサイズと想定されていますが、POSIXの fstat がより適切な推定値を提供することが多いです。

バッファサイズを変更するユースケースの1つは、より適切なサイズが既知の場合です。(この例ではいくつかのPOSIX関数を使用しています。例: fileno 。参照:SO: #1 および #2 )。

// Make some POSIX functions, such as `int fileno(FILE*)`, visible:
#define _POSIX_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(void)
{
    FILE* fp = fopen("/tmp/test.txt", "w+");
    if (fp == NULL)
    {
        perror("fopen");
        return EXIT_FAILURE;
    }
    struct stat stats;
    if (fstat(fileno(fp), &stats) == -1) // POSIX only
    {
        perror("fstat");
        return EXIT_FAILURE;
    }
    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 EXIT_FAILURE;
    }
    int ch;
    while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to
                                  // observe the read(2) syscalls used
    fclose(fp);
    return EXIT_SUCCESS;
}

出力例:

BUFSIZ is 8192, but optimal block size is 65536

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.21.5.6 setvbuf関数 (p: 225)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.21.5.6 setvbuf関数 (p: 308)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.19.5.6 setvbuf関数 (p: 273-274)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.9.5.6 setvbuf関数

関連項目

ファイルストリームのバッファを設定する
(関数)