名前空間
変種
操作

std::setvbuf

提供: cppreference.com
< cpp‎ | io‎ | c
 
 
入出力ライブラリ
入出力マニピュレータ
Cスタイルの入出力
バッファ
(C++98で非推奨)
ストリーム
抽象
ファイル入出力
文字列入出力
配列入出力
(C++98で非推奨)
(C++98で非推奨)
(C++98で非推奨)
同期化出力
エラーカテゴリインタフェース
(C++11)
 
 
ヘッダ <cstdio> で定義
int setvbuf( std::FILE* stream, char* buffer, int mode, std::size_t size );

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

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

目次

[編集] 引数

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

[編集] 戻り値

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

[編集] ノート

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

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

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

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

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

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

[編集]

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

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

出力例:

BUFSIZ is 8192, but optimal block size is 65536

[編集] 関連項目

ファイルストリームのためのバッファを設定します
(関数) [edit]
[仮想]
ユーザ提供のバッファを提供し、またはこの filebuf をバッファなしにします
(std::basic_filebuf<CharT,Traits>の仮想プロテクテッドメンバ関数) [edit]