std::basic_filebuf<CharT,Traits>::setbuf
From cppreference.com
< cpp | io | basic filebuf
| protected: virtual std::basic_streambuf<CharT, Traits>* setbuf( char_type* s, std::streamsize n ) |
||
もしsがヌルポインタで、nがゼロの場合、ファイルバッファは出力のために*バッファリングなし*になります。これは、pbase()とpptr()がヌルであり、すべての出力が即座にファイルに送信されることを意味します。
それ以外の場合、setbuf()の呼び出しは内部バッファ(制御された文字シーケンス)を、sで指される先頭要素を持つユーザー提供の文字配列に置き換えます。このstd::basic_filebufオブジェクトは、その配列内で最大nバイトをバッファリングに使用できます。
この関数はprotected virtualであり、pubsetbuf()から、またはstd::basic_filebufから派生したユーザー定義クラスのメンバ関数からのみ呼び出すことができます。
目次 |
[編集] パラメータ
| s | - | ユーザー提供バッファ内の最初のCharTへのポインタ、またはヌル |
| n | - | ユーザー提供バッファ内のCharT要素の数、またはゼロ |
[編集] 戻り値
this
[編集] 注記
この関数が使用される条件と、提供されたバッファの使用方法は実装定義です。
- GCC 4.6 libstdc++
-
setbuf()は、std::basic_filebufがファイルに関連付けられていない場合にのみ呼び出すことができます(それ以外の場合は効果がありません)。ユーザー提供バッファの場合、ファイルからの読み取りは一度にn-1バイトずつ行われます。
- Clang++3.0 libc++
-
setbuf()は、ファイルを開いた後、I/Oが行われる前であれば呼び出すことができます(それ以外の場合はクラッシュする可能性があります)。ユーザー提供バッファの場合、ファイルからの読み取りは、バッファに収まる最大の4096の倍数で行われます。
- Visual Studio 2010
-
setbuf()は、I/Oが実行された後であっても、いつでも呼び出すことができます。バッファの現在の内容は、もしあれば失われます。
標準では、この関数に関してsetbuf(0, 0)が、I/Oが実行される前に呼び出された場合にバッファリングなしの出力を設定することが要求されることを除いて、どのような動作も定義されていません。
[編集] 例
読み取り用に10kのバッファを提供します。Linuxでは、straceユーティリティを使用して実際の読み取りバイト数を確認できます。
このコードを実行
#include <fstream> #include <iostream> #include <string> int main() { int cnt = 0; std::ifstream file; char buf[10241]; file.rdbuf()->pubsetbuf(buf, sizeof buf); file.open("/usr/share/dict/words"); for (std::string line; getline(file, line);) ++cnt; std::cout << cnt << '\n'; }
実行結果の例
356010
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 173 | C++98 | nの型がintと誤って指定されていました。 |
std::streamsizeに修正されました。 |
[編集] 関連項目
| setbuf() を呼び出す ( std::basic_streambuf<CharT,Traits> の public メンバ関数) | |
| ファイルストリームのバッファとそのサイズを設定する (関数) |