std::setvbuf
From cppreference.com
| ヘッダ <cstdio>で定義 |
||
| int setvbuf( std::FILE* stream, char* buffer, int mode, std::size_t size ); |
||
指定されたファイルストリームstreamのバッファリングモードを、引数modeで指定されたように変更します。さらに、
- もしbufferがヌルポインタの場合、内部バッファをsizeにリサイズします。
- もしbufferがヌルポインタでない場合、ストリームにsizeのサイズでbufferから始まるユーザー提供のバッファを使用するように指示します。lifetimeがbufferが指す配列のlifetimeよりも前に終了する前に、ストリームは(std::fcloseで)閉じられる必要があります。成功したstd::setvbufの呼び出し後の配列の内容は不定であり、それを使用する試みは未定義の動作です。
目次 |
[edit] Parameters
| stream | - | バッファを設定するファイルストリーム | ||||||
| buffer | - | ストリームが使用するバッファへのポインタ、またはサイズとモードのみを変更するためのヌルポインタ | ||||||
| モード | - | 使用するバッファリングモード。以下のいずれかの値になります。
| ||||||
| 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メンバ関数) |
| Cドキュメント (setvbuf)
| |