名前空間
変種
操作

std::setvbuf

From cppreference.com
< cpp‎ | io‎ | c
 
 
 
C形式I/O
型とオブジェクト
関数
ファイルアクセス
setvbuf

直接入出力
非書式化入出力
書式付き入力
(C++11)(C++11)(C++11)    
(C++11)(C++11)(C++11)    
書式付き出力
ファイルポジショニング
エラーハンドリング
ファイル操作
 
ヘッダ<cstdio>で定義
int setvbuf( std::FILE* stream, char* buffer, int mode, std::size_t size );

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

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

目次

[edit] Parameters

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

[edit] Return value

成功した場合は0、失敗した場合はゼロ以外の値を返します。

[edit] Notes

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

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

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

一般的なエラーは、stdinまたはstdoutのバッファを、プログラム終了前にlifetimeが終了する配列に設定することです。

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

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

[edit] Example

バッファサイズを変更するユースケースの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

[edit] See also

ファイルストリームのバッファを設定する
(関数) [編集]
[virtual]
ユーザー提供のバッファを提供する、またはこのファイルバッファをバッファリングなしにする
(std::basic_filebuf<CharT,Traits>の仮想protectedメンバ関数) [edit]
Cドキュメントsetvbuf
English 日本語 中文(简体) 中文(繁體)