名前空間
変種
操作

setvbuf

From cppreference.com
< c‎ | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
setvbuf

非書式化入出力
(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以降)
#define _IOFBF     /*未指定*/

#define _IOLBF     /*未指定*/

#define _IONBF     /*未指定*/

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

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

目次

[編集] パラメータ

stream - バッファを設定するファイルストリーム
buffer - ストリームが使用するバッファへのポインタ、またはサイズとモードのみを変更するためのNULLポインタ
モード - 使用するバッファリングモード。以下のいずれかの値を指定できます。
_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は、実装におけるファイルI/Oの最も効率的なバッファサイズであると予想されますが、POSIXのfstatはより良い推定値を提供することがよくあります。

[編集]

バッファサイズを変更するユースケースの1つは、より良いサイズがわかっている場合です。(この例では、filenoなどのPOSIX関数を使用しています。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 The setvbuf function (p: 225)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.21.5.6 The setvbuf function (p: 308)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.19.5.6 The setvbuf function (p: 273-274)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.9.5.6 The setvbuf function

[編集] 関連項目

ファイルストリームのバッファを設定する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)