Namespaces
Variants

std:: setvbuf

From cppreference.net
< cpp ‎ | io ‎ | c
ヘッダーで定義 <cstdio>
int setvbuf ( std:: FILE * stream, char * buffer, int mode, std:: size_t size ) ;

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

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

目次

パラメータ

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

戻り値

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

注記

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

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

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

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

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

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

バッファサイズを変更するユースケースの1つは、より適切なサイズが既知の場合です。

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <sys/stat.h>
int main()
{
    std::FILE* fp = std::fopen("/tmp/test.txt", "w+");
    if (!fp)
    {
        std::perror("fopen");
        return EXIT_FAILURE;
    }
    struct stat stats;
    if (fstat(fileno(fp), &stats) == -1) // POSIX only
    {
        std::perror("fstat");
        return EXIT_FAILURE;
    }
    std::cout << "BUFSIZ is " << BUFSIZ << ", but optimal block size is "
              << stats.st_blksize << '\n';
    if (std::setvbuf(fp, nullptr, _IOFBF, stats.st_blksize) != 0)
    {
        std::perror("setvbuf failed"); // POSIX version sets errno
        return EXIT_FAILURE;
    }
    // Read entire file: use truss/strace to observe the read(2) syscalls used
    for (int ch; (ch = std::fgetc(fp)) != EOF;)
    {}
    std::fclose(fp);
    return EXIT_SUCCESS;
}

出力例:

BUFSIZ is 8192, but optimal block size is 65536

関連項目

ファイルストリームのバッファを設定する
(関数)
[virtual]
ユーザー提供のバッファを設定するか、このファイルバッファを非バッファリングモードにする
( std::basic_filebuf<CharT,Traits> の仮想保護メンバー関数)