basic_streambuf クラス
ストリームの特定の表現との相互間での要素の伝送を制御する、ストリーム バッファーを派生させるための抽象基底クラスについて説明します。
構文
template <class Elem, class Tr = char_traits<Elem>>
class basic_streambuf;
パラメーター
Elem
char_type。
Tr
文字の traits_type。
解説
このクラス テンプレートは、ストリームの特定の表現との相互間での要素の伝送を制御する、ストリーム バッファーを派生させるための抽象基底クラスについて説明します。 クラス basic_streambuf
のオブジェクトは、char_type とも呼ばれる型 Tr の要素を含むストリームを制御するのに役立ちます。この型の文字特性は、traits_type とも呼ばれる char_traits クラスによって決まります。
各ストリーム バッファーは、抽出 (入力) 用ストリームと挿入 (出力) 用ストリームという 2 つの独立したストリームを概念上制御します。 ただし、特定の表現によってこれらのストリームのいずれか、もしくは両方がアクセス不可になる場合があります。 通常、そのような表現は、これら 2 つのストリームの何らかの関係を保持しています。 たとえば、basic_stringbuf<Elem
, Tr
> オブジェクトの出力ストリームに挿入したものが、その入力ストリームから後で抽出するものになります。 basic_filebuf<Elem
, Tr
> オブジェクトの 1 つのストリームを配置するときは、もう一方のストリームを直列に配置します。
クラス テンプレート basic_streambuf
のパブリック インターフェイスでは、すべてのストリーム バッファーに共通な操作をそれぞれに特殊化して行えます。 保護されたインターフェイスでは、ストリームの特定の表現を動作させるのに必要な操作を行えます。 プロテクト仮想メンバー関数を使用することにより、ストリームの特定の表現に対する派生ストリーム バッファーの動作を調整できます。 このライブラリ内の各派生ストリーム バッファーで、各バッファーのプロテクト仮想メンバー関数に特殊化した動作方法について記述します。 多くの場合、何も行わない基本クラスの既定の動作については、この記事で説明します。
残りのプロテクト メンバー関数は、ストリームとのバッファーのやり取りに提供されるストレージとのコピーのやり取りを制御します。 たとえば、入力バッファーには以下の特性を指定できます。
同様に、出力バッファーには以下の特性を指定できます。
どのバッファーの場合も、次のプロトコルが使用されます。
ネクスト ポインターが null の場合、バッファーは存在しません。 それ以外の場合、3 つのポインターはすべて同じシーケンスを指し示します。 これらは順序で比較できます。
出力バッファーの場合、ネクスト ポインターの比較対象がエンド ポインター未満であれば、ネクスト ポインターで指定された書き込み位置に要素を格納できます。
入力バッファーの場合、ネクスト ポインターの比較対象がエンド ポインター未満であれば、ネクスト ポインターで指定された読み取り位置で要素を読み取ることができます。
入力バッファーの場合、開始ポインターの比較対象がネクスト ポインター未満であれば、デクリメントされたネクスト ポインターで指定された戻り位置の要素を戻すことができます。
basic_streambuf
<Elem
, Tr
> の派生クラス用に作成するプロテクト仮想メンバー関数すべては、このプロトコルを維持する点で協調して動作する必要があります。
クラス basic_streambuf
<Elem
, Tr
> のオブジェクトは、ここまでに説明した 6 つのポインターを格納します。 また、派生ストリーム バッファーが使用する可能性のある locale 型のオブジェクトのロケール オブジェクトを格納します。
コンストラクター
コンストラクター | 説明 |
---|---|
basic_streambuf | basic_streambuf 型のオブジェクトを構築します。 |
Typedefs
型名 | 説明 |
---|---|
char_type | 型名を Elem テンプレート パラメーターに関連付けます。 |
int_type | basic_streambuf スコープ内の型名と Elem テンプレート パラメーターを関連付けます。 |
off_type | basic_streambuf スコープ内の型名と Elem テンプレート パラメーターを関連付けます。 |
pos_type | basic_streambuf スコープ内の型名と Elem テンプレート パラメーターを関連付けます。 |
traits_type | 型名を Tr テンプレート パラメーターに関連付けます。 |
メンバー関数
メンバー関数 | 説明 |
---|---|
eback | 入力バッファーの先頭を指すポインターを返すプロテクト関数。 |
egptr | 入力バッファーの末尾を越えてポインターを返すプロテクト関数。 |
epptr | 出力バッファーの末尾を越えてポインターを返すプロテクト関数。 |
gbump | count を入力バッファーのネクスト ポインターに追加するプロテクト関数。 |
getloc | basic_streambuf オブジェクトのロケールを取得します。 |
gptr | 入力バッファーの次の要素を指すポインターを返すプロテクト関数。 |
imbue | pubimbue によって呼び出されるプロテクト仮想関数。 |
in_avail | バッファーから読み取る準備が整っている要素の数を返します。 |
overflow | いっぱいのバッファーに新しい文字が挿入されたときに呼び出すことができる、プロテクト仮想関数。 |
pbackfail | 要素を入力ストリームに戻そうと試み、その要素を現在の要素に (ネクスト ポインターによって指されるように) するプロテクト仮想メンバー関数。 |
pbase | 出力バッファーの先頭を指すポインターを返すプロテクト関数。 |
pbump | count を出力バッファーのネクスト ポインターに追加するプロテクト関数。 |
pptr | 出力バッファーの次の要素を指すポインターを返すプロテクト関数。 |
pubimbue | basic_streambuf オブジェクトのロケールを設定します。 |
pubseekoff | 派生クラスでオーバーライドされるプロテクト仮想関数 seekoff を呼び出します。 |
pubseekpos | 派生クラスでオーバーライドされ、現在のポインターの位置をリセットするプロテクト仮想関数 seekpos を呼び出します。 |
pubsetbuf | 派生クラスでオーバーライドされるプロテクト仮想関数 setbuf を呼び出します。 |
pubsync | 派生クラスでオーバーライドされ、このバッファーに関連付けられた外部ストリームを更新するプロテクト仮想関数 sync を呼び出します。 |
sbumpc | ストリーム ポインターを移動させながら、現在の要素を読み取って返します。 |
seekoff | プロテクト仮想メンバー関数が、制御されているストリームの現在の位置を変更しようと試みます。 |
seekpos | プロテクト仮想メンバー関数が、制御されているストリームの現在の位置を変更しようと試みます。 |
setbuf | プロテクト仮想メンバー関数が、各派生ストリーム バッファーに固有の操作を実行します。 |
setg | 開始ポインターの _Gbeg 、ネクスト ポインターの _Gnext 、およびエンド ポインターの _Gend を入力バッファー用に格納するプロテクト関数。 |
setp | 開始ポインターの _Pbeg およびエンド ポインターの _Pend を出力バッファー用に格納するプロテクト関数。 |
sgetc | ストリーム内の位置を変更せずに、現在の要素を返します。 |
sgetn | 読み取られる要素数を返します。 |
showmanyc | 入力ストリームから抽出できる文字数のカウントを返す保護された仮想メンバー関数。 また、プログラムが無期限の待機の対象にならないことも保証されます。 |
snextc | 現在の要素を読み取り、次の要素を返します。 |
sputbackc | char_type をストリームに渡します。 |
sputc | ストリームに単一の文字を渡します。 |
sputn | ストリームに文字列を渡します。 |
stossc | ストリーム内の現在の要素の直後に移動します。 |
sungetc | ストリームから単一の文字を取得します。 |
スワップ | このオブジェクトの値を、指定した basic_streambuf オブジェクト パラメーターの値と交換します。 |
sync | 制御されているストリームと関連付けられている外部ストリームとの同期を試みるプロテクト仮想関数。 |
uflow | 入力ストリームから現在の要素を抽出するプロテクト仮想関数。 |
underflow | 入力ストリームから現在の要素を抽出するプロテクト仮想関数。 |
xsgetn | 入力ストリームから要素を抽出するプロテクト仮想関数。 |
xsputn | 出力ストリームに要素を挿入するプロテクト仮想関数。 |
演算子
演算子 | 説明 |
---|---|
operator= | 別の basic_streambuf オブジェクトの値をこのオブジェクトに割り当てます。 |
要件
ヘッダー:<streambuf>
名前空間: std
basic_streambuf::basic_streambuf
basic_streambuf
型のオブジェクトを構築します。
basic_streambuf();
basic_streambuf(const basic_streambuf& right);
パラメーター
right
この basic_streambuf
オブジェクトに値を設定するために使用される basic_streambuf
オブジェクトへの左辺値参照。
解説
最初の保護されたコンストラクターは、入力バッファーと出力バッファーを制御するすべてのポインターに Null ポインターを格納します。 また、locale::classic
をロケール オブジェクトに格納します。 詳細については、「locale::classic」を参照してください。
2 つ目の保護されたコンストラクターは、ポインターとロケールを right からコピーします。
basic_streambuf::char_type
型名を Elem テンプレート パラメーターに関連付けます。
typedef Elem char_type;
basic_streambuf::eback
入力バッファーの先頭を指すポインターを返すプロテクト関数。
char_type *eback() const;
戻り値
バッファーの先頭を指すポインター。
basic_streambuf::egptr
入力バッファーの末尾を越えてポインターを返すプロテクト関数。
char_type *egptr() const;
戻り値
入力バッファーの末尾を越えてポインター。
basic_streambuf::epptr
出力バッファーの末尾を越えてポインターを返すプロテクト関数。
char_type *epptr() const;
戻り値
出力バッファーの末尾を越えてポインター。
basic_streambuf::gbump
count を入力バッファーの次のポインターに追加するプロテクト関数。
void gbump(int count);
パラメーター
count
マウス ポインターを進める量。
basic_streambuf::getloc
basic_streambuf オブジェクトのロケールを取得します。
locale getloc() const;
戻り値
格納されているロケール オブジェクト。
解説
関連情報については、「ios_base::getloc」を参照してください。
例
// basic_streambuf_getloc.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
cout << cout.rdbuf( )->getloc( ).name( ).c_str( ) << endl;
}
C
basic_streambuf::gptr
入力バッファーの次の要素を指すポインターを返すプロテクト関数。
char_type *gptr() const;
戻り値
入力バッファーの次の要素へのポインター。
basic_streambuf::imbue
pubimbue によって呼び出されるプロテクト仮想関数。
virtual void imbue(const locale& _Loc);
パラメーター
_Loc
ロケールへの参照。
解説
既定の動作では、何も行いません。
basic_streambuf::in_avail
バッファーから読み取る準備が整っている要素の数を返します。
streamsize in_avail();
戻り値
バッファーから読み取る準備が整っている要素の数。
解説
読み取り位置が使用可能な場合、メンバー関数は egptr - gptr を返します。 それ以外の場合は、showmanyc を返します。
例
// basic_streambuf_in_avail.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
char c;
// cin's buffer is empty, in_avail will return 0
cout << cin.rdbuf( )->in_avail( ) << endl;
cin >> c;
cout << cin.rdbuf( )->in_avail( ) << endl;
}
basic_streambuf::int_type
basic_streambuf スコープ内の型名をテンプレート パラメーター内の型のいずれかと関連付けます。
typedef typename traits_type::int_type int_type;
basic_streambuf::off_type
basic_streambuf スコープ内の型名をテンプレート パラメーター内の型のいずれかと関連付けます。
typedef typename traits_type::off_type off_type;
basic_streambuf::operator=
別の basic_streambuf
オブジェクトの値をこのオブジェクトに割り当てます。
basic_streambuf& operator=(const basic_streambuf& right);
パラメーター
right
このオブジェクトに値を代入するために使用される basic_streambuf
オブジェクトへの左辺値参照。
解説
プロテクト メンバー演算子は、入力バッファーと出力バッファーを制御するポインターを right からコピーします。 また、right.
getloc() を locale object
に格納します。 *this
を返します。
basic_streambuf::overflow
いっぱいのバッファーに新しい文字が挿入されたときに呼び出すことができる、プロテクト仮想関数。
virtual int_type overflow(int_type _Meta = traits_type::eof());
パラメーター
_Meta
バッファーまたは traits_type::eof に挿入する文字。
戻り値
関数が成功しない場合は、 traits_type::eof を返すか、例外をスローします。 それ以外の場合は、traits_type::not_eof(_ Meta) を返します。 既定の動作では、traits_type::eof を返します。
解説
_Metaが traits_type::eof と等しくない場合、保護された仮想メンバー関数は、要素 traits_type::to_char_type(_Meta) を出力ストリームに挿入するよう努めます。 これはさまざまな方法で行うことができます。
write position
が使用可能な場合は、書き込み位置に要素を格納し、出力バッファーのネクスト ポインターをインクリメントできます。新しい記憶域または追加の記憶域を出力バッファーに割り当てることで、書き込み位置を使用可能にすることができます。
出力バッファーの先頭とネクスト ポインターの間の一部またはすべての要素をいくつかの外部の宛先に書き出すことで、書き込み位置を使用可能にすることができます。
仮想オーバーフロー関数は sync 関数と underflow 関数とともに、streambuf から派生したクラスの特性を定義します。 派生した各クラスは、オーバーフローを異なる方法で実装できますが、呼び出すストリーム クラスとのインターフェイスは同じです。
overflow
関数は、put 領域がいっぱいの時に sputc
や sputn
のようなパブリック streambuf
関数で最も頻繁に呼び出されますが、ストリーム クラスなどのその他のクラスはいつでも overflow
を呼び出すことができます。
関数は、pbase
ポインターと pptr
ポインター間の put 領域内の文字を使用し、put 領域を再初期化します。 overflow
関数はnCh
も使用する必要があります (nCh
がEOF
されていない場合)、または次の呼び出しで使用されるように、その文字を新しい put 領域に配置することもできます。
消費の定義は、派生クラスによって異なります。 たとえば、filebuf
クラスが文字をファイルに書き込むのに対し、strstreambuf
クラスは、文字をそのバッファーに保持して、(バッファーが動的として指定されている場合は) オーバーフローへの呼び出しに応えてバッファーを拡張します。 この拡張は、古いバッファーを解放して、新しいより大きなバッファーで置換することで実現されます。 ポインターは必要に応じて調整されます。
basic_streambuf::p backfail
要素を入力ストリームに戻そうと試み、その要素を現在の要素に (ネクスト ポインターによって指されるように) するプロテクト仮想メンバー関数。
virtual int_type pbackfail(int_type _Meta = traits_type::eof());
パラメーター
_Meta
バッファーまたは traits_type::eof に挿入する文字。
戻り値
関数が成功しない場合は、 traits_type::eof を返すか、例外をスローします。 それ以外の場合、関数は別の値を返します。 既定の動作では、traits_type::eof を返します。
解説
_Meta が traits_type::eof と等しい場合、プッシュバックする要素は、実質的に、現在の要素の前に既にストリームにある要素になります。 それ以外の場合、その要素が traits_type::to_char_type(_Meta) で置き換えられます。 この関数は、さまざまな方法で要素を戻すことができます。
戻り位置が使用可能な場合は、戻り位置に要素を格納し、入力バッファーのネクスト ポインターをデクリメントできます。
新しい記憶域または追加の記憶域を入力バッファーに割り当てることで、戻り位置を使用可能にすることができます。
一般的な入力ストリームと出力ストリームがあるストリーム バッファーの場合、出力バッファーの先頭とネクスト ポインターの間の一部またはすべての要素をいくつかの外部の宛先に書き出すことで、戻り位置を使用可能にすることができます。
basic_streambuf::p base
出力バッファーの先頭を指すポインターを返すプロテクト関数。
char_type *pbase() const;
戻り値
出力バッファーの先頭を指すポインター。
basic_streambuf::p bump
count を出力バッファーの次のポインターに追加するプロテクト関数。
void pbump(int count);
パラメーター
count
書き込み位置を前方に移動する文字数。
basic_streambuf::p os_type
basic_streambuf スコープ内の型名をテンプレート パラメーター内の型のいずれかと関連付けます。
typedef typename traits_type::pos_type pos_type;
basic_streambuf::p ptr
出力バッファーの次の要素を指すポインターを返すプロテクト関数。
char_type *pptr() const;
戻り値
出力バッファーの次の要素を指すポインター。
basic_streambuf::p ubimbue
basic_streambuf オブジェクトのロケールを設定します。
locale pubimbue(const locale& _Loc);
パラメーター
_Loc
ロケールへの参照。
戻り値
ロケール オブジェクトに格納されている以前の値。
解説
メンバー関数は、_ Loc をロケール オブジェクトに格納し、imbue を呼び出します。
例
pubimbue
の使用例については、「basic_ios::imbue」を参照してください。
basic_streambuf::p ubseekoff
派生クラスでオーバーライドされるプロテクト仮想関数 seekoff を呼び出します。
pos_type pubseekoff(off_type _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
パラメーター
_Off
シークする _Way の相対位置。
_Way
オフセット演算の開始位置。 有効値については、「seekdir」を参照してください。
_Which
ポインター位置のモードを指定します。 既定では、読み取り位置および書き込み位置を変更できます。
戻り値
新しい位置または無効なストリーム位置 (seekoff(_ Off, _Way
, _Which
)) を返します。
解説
_Way に対してポインターを移動します。
basic_streambuf::p ubseekpos
派生クラスでオーバーライドされ、現在のポインターの位置をリセットするプロテクト仮想関数 seekpos を呼び出します。
pos_type pubseekpos(pos_type _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
パラメーター
_Sp
シークする位置。
_Which
ポインター位置のモードを指定します。 既定では、読み取り位置および書き込み位置を変更できます。
戻り値
新しい位置または無効なストリーム位置。 ストリームの位置が無効であることを確認するには、戻り値と pos_type(off_type(-1))
を比較します。
解説
このメンバー関数は、seekpos(_ Sp, _Which
) を返します。
basic_streambuf::p ubsetbuf
派生クラスでオーバーライドされるプロテクト仮想関数 setbuf を呼び出します。
basic_streambuf<Elem, Tr> *pubsetbuf(
char_type* _Buffer,
streamsize count);
パラメーター
_Buffer
このインスタンス化の char_type
を指すポインター。
count
バッファーのサイズ。
戻り値
setbuf( _Buffer
, count
) を返します。
basic_streambuf::p ubsync
派生クラスでオーバーライドされ、このバッファーに関連付けられた外部ストリームを更新するプロテクト仮想関数 sync を呼び出します。
int pubsync();
戻り値
失敗した場合は sync または -1 を返します。
basic_streambuf::sbumpc
ストリーム ポインターを移動させながら、現在の要素を読み取って返します。
int_type sbumpc();
戻り値
現在の要素。
解説
読み取り位置が使用可能な場合、メンバー関数は traits_type::to_int_type(*gptr) を返し、入力バッファーの次のポインターをインクリメントします。 それ以外の場合は、uflow を返します。
例
// basic_streambuf_sbumpc.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
int i = 0;
i = cin.rdbuf( )->sbumpc( );
cout << i << endl;
}
3
33
51
basic_streambuf::seekoff
制御対象ストリームの現在の位置を変更しようと試みるプロテクト仮想メンバー関数。
virtual pos_type seekoff(
off_type _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
パラメーター
_Off
シークする _Way の相対位置。
_Way
オフセット演算の開始位置。 有効値については、「seekdir」を参照してください。
_Which
ポインター位置のモードを指定します。 既定では、読み取り位置および書き込み位置を変更できます。
戻り値
新しい位置または無効なストリーム位置 (seekoff
(_ Off、 _Way
、 _Which
) を返します。
解説
新しい位置は、次のように決定されます。
_Way
==ios_base::beg
の場合、新しい位置はストリームの先頭と _ Off です。_Way
==ios_base::cur
の場合、新しい位置は現在のストリームの位置と _ Off です。_Way
==ios_base::end
の場合、新しい位置はストリームの最後と _ Off です。
通常、which & ios_base::in が 0 以外の場合、入力ストリームが影響を受け、which & ios_base::out が 0 以外の場合、出力ストリームが影響を受けます。 ただし、このパラメーターの実際の使用は、派生ストリーム バッファー間で異なります。
関数はストリームの位置の変更に成功すると、結果のストリームの位置を返します。複数の位置の変更に成功した場合は、結果のストリームの位置のうちの 1 つを返します。 それ以外の場合は、無効なストリームの位置が返されます。 既定の動作では、無効なストリームの位置を返します。
basic_streambuf::seekpos
制御対象ストリームの現在の位置を変更しようと試みるプロテクト仮想メンバー関数。
virtual pos_type seekpos(pos_type _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
パラメーター
_Sp
シークする位置。
_Which
ポインター位置のモードを指定します。 既定では、読み取り位置および書き込み位置を変更できます。
戻り値
新しい位置または無効なストリーム位置。 ストリームの位置が無効であることを確認するには、戻り値と pos_type(off_type(-1))
を比較します。
解説
新しい位置は _ Sp です。
通常、which & ios_base::in が 0 以外の場合、入力ストリームが影響を受け、which & ios_base::out が 0 以外の場合、出力ストリームが影響を受けます。 ただし、このパラメーターの実際の使用は、派生ストリーム バッファー間で異なります。
関数はストリームの位置の変更に成功すると、結果のストリームの位置を返します。複数の位置の変更に成功した場合は、結果のストリームの位置のうちの 1 つを返します。 それ以外の場合は、無効なストリームの位置 (-1) を返します。 既定の動作では、無効なストリームの位置を返します。
basic_streambuf::setbuf
各派生ストリーム バッファーに固有の操作を実行するプロテクト仮想メンバー関数。
virtual basic_streambuf<Elem, Tr> *setbuf(
char_type* _Buffer,
streamsize count);
パラメーター
_Buffer
バッファーへのポインター。
count
バッファーのサイズ。
戻り値
既定の動作では、this
が返されます。
解説
「basic_filebuf」を参照してください。 setbuf
は streambuf
オブジェクトが使用するメモリ領域を提供します。 派生クラス内の定義でのバッファーの使用方法。
basic_streambuf::setg
開始ポインターの _ Gbeg、ネクスト ポインターの _Gnext
、およびエンド ポインターの _Gend
を入力バッファー用に格納するプロテクト関数。
void setg(char_type* _Gbeg,
char_type* _Gnext,
char_type* _Gend);
パラメーター
_Gbeg
バッファーの先頭を指すポインター。
_Gnext
バッファーの中心付近を指すポインター。
_Gend
バッファーの末尾を指すポインター。
basic_streambuf::setp
開始ポインターの _Pbeg およびエンド ポインターの _Pend を出力バッファー用に格納するプロテクト関数。
void setp(char_type* _Pbeg, char_type* _Pend);
パラメーター
_Pbeg
バッファーの先頭を指すポインター。
_Pend
バッファーの末尾を指すポインター。
basic_streambuf::sgetc
ストリーム内の位置を変更せずに、現在の要素を返します。
int_type sgetc();
戻り値
現在の要素。
解説
読み取り位置が使用可能な場合、メンバー関数は traits_type::to_int_type( *
gptr) を返します。 それ以外の場合は、underflow を返します。
例
// basic_streambuf_sgetc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile( "basic_streambuf_sgetc.txt", ios::in );
char i = myfile.rdbuf( )->sgetc( );
cout << i << endl;
i = myfile.rdbuf( )->sgetc( );
cout << i << endl;
}
basic_streambuf::sgetn
最大 count 文字を入力バッファーから抽出し、指定のバッファー ptr にそれらを格納します。
渡された値が正しいことの確認を呼び出し元に依存するため、このメソッドは安全ではない可能性があります。
streamsize sgetn(
char_type* ptr,
streamsize count);
パラメーター
ptr
抽出した文字を格納するバッファー。
count
読み取られる要素数。
戻り値
読み取られる要素数。 詳細については、「 streamsize 」を参照してください。
解説
このメンバー関数は xsgetn( ptr
, count
) を返します。
例
// basic_streambuf_sgetn.cpp
// compile with: /EHsc /W3
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ifstream myfile("basic_streambuf_sgetn.txt", ios::in);
char a[10];
// Extract 3 characters from myfile and store them in a.
streamsize i = myfile.rdbuf()->sgetn(&a[0], 3); // C4996
a[i] = myfile.widen('\0');
// Display the size and contents of the buffer passed to sgetn.
cout << i << " " << a << endl;
// Display the contents of the original input buffer.
cout << myfile.rdbuf() << endl;
}
basic_streambuf::showmanyc
入力ストリームから抽出できる文字数のカウントを返し、プログラムが無期限の待機の対象にならないよう保護された仮想メンバー関数。
virtual streamsize showmanyc();
戻り値
既定の動作では、0 が返されます。
basic_streambuf::snextc
現在の要素を読み取り、次の要素を返します。
int_type snextc();
戻り値
ストリームの次の要素。
解説
メンバー関数は sbumpc を呼び出し、その関数が traits_type::eof を返す場合には、traits_type::eof を返します。 それ以外の場合は、sgetc を返します。
例
// basic_streambuf_snextc.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
int i = 0;
i = cin.rdbuf( )->snextc( );
// cout << ( int )char_traits<char>::eof << endl;
cout << i << endl;
}
aa
aa97
basic_streambuf::sputbackc
ストリームに char_type を配置します。
int_type sputbackc(char_type _Ch);
パラメーター
_Ch
文字。
戻り値
文字またはエラーを返します。
解説
戻り位置が使用可能で、_Ch がその位置に格納されている文字と同じ場合には、メンバー関数は入力バッファーの次のポインターをデクリメントし、traits_type::to_int_type( _Ch
) を返します。 それ以外の場合は、pbackfail( _Ch
) を返します。
例
// basic_streambuf_sputbackc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile("basic_streambuf_sputbackc.txt",
ios::in);
int i = myfile.rdbuf()->sbumpc();
cout << (char)i << endl;
int j = myfile.rdbuf()->sputbackc('z');
if (j == 'z')
{
cout << "it worked" << endl;
}
i = myfile.rdbuf()->sgetc();
cout << (char)i << endl;
}
basic_streambuf::sputc
ストリームに単一の文字を渡します。
int_type sputc(char_type _Ch);
パラメーター
_Ch
文字。
戻り値
正常終了した場合は、文字を返します。
解説
write position
が使用可能な場合、メンバー関数は _Ch を書き込み位置に格納し、出力バッファーの次のポインターをインクリメントし、traits_type::to_int_type( _Ch
) を返します。 それ以外の場合は、overflow( _Ch
) を返します。
例
// basic_streambuf_sputc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
int i = cout.rdbuf( )->sputc( 'a' );
cout << endl << ( char )i << endl;
}
a
a
basic_streambuf::sputn
ストリームに文字列を渡します。
streamsize sputn(const char_type* ptr, streamsize count);
パラメーター
ptr
文字列。
count
文字数。
戻り値
ストリームに挿入された文字数。
解説
このメンバー関数は xsputn( ptr
, count
) を返します。 詳細については、このメンバーの「解説」セクションを参照してください。
例
// basic_streambuf_sputn.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
streamsize i = cout.rdbuf()->sputn("test", 4);
cout << endl << i << endl;
}
test
4
basic_streambuf::stossc
ストリーム内の現在の要素の直後に移動します。
void stossc();
解説
メンバー関数は、sbumpc を呼び出します。 このメンバー関数を提供するために実装は必要ありません。
例
// basic_streambuf_stossc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile( "basic_streambuf_stossc.txt", ios::in );
myfile.rdbuf( )->stossc( );
char i = myfile.rdbuf( )->sgetc( );
cout << i << endl;
}
basic_streambuf::sungetc
ストリームから単一の文字を取得します。
int_type sungetc();
戻り値
文字またはエラーを返します。
解説
戻り位置が使用可能な場合、メンバー関数は入力バッファーのネクスト ポインターをデクリメントし、traits_type::
to_int_type( *
gptr) を返します。 ただし、現在のバッファーの状態でキャプチャできるように、最後に読み取られた文字を特定できるわけではありません。 この場合、関数は pbackfail を返します。 この状況を回避するには、元に戻す文字を追跡し、 sputbackc(ch)
を呼び出します。これは、ストリームの先頭で呼び出さなくても、複数の文字を元に戻そうとしない場合は失敗しません。
例
// basic_streambuf_sungetc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile( "basic_streambuf_sungetc.txt", ios::in );
// Read and increment
int i = myfile.rdbuf( )->sbumpc( );
cout << ( char )i << endl;
// Read and increment
i = myfile.rdbuf( )->sbumpc( );
cout << ( char )i << endl;
// Decrement, read, and do not increment
i = myfile.rdbuf( )->sungetc( );
cout << ( char )i << endl;
i = myfile.rdbuf( )->sungetc( );
cout << ( char )i << endl;
i = myfile.rdbuf( )->sbumpc( );
cout << ( char )i << endl;
}
basic_streambuf::swap
このオブジェクトの値を、指定した basic_streambuf
オブジェクトの値と交換します。
void swap(basic_streambuf& right);
パラメーター
right
値を交換するために使用される basic_streambuf
オブジェクトの左辺値参照。
解説
プロテクト メンバー関数は、input buffer
および output buffer
を制御するすべてのポインターを right と交換します。 right.
getloc() も locale
オブジェクトと交換します。
basic_streambuf::sync
制御されているストリームと関連付けられている外部ストリームとの同期を試みるプロテクト仮想関数。
virtual int sync();
戻り値
関数が成功しない場合は、-1 を返します。 既定の動作では、0 が返されます。
解説
sync
には出力バッファーの開始ポインターとネクスト ポインター間の任意の要素の記述が必要です。 入力バッファーの次のポインターと終了ポインターの間に要素を戻す必要はありません。
basic_streambuf::traits_type
型名を Tr テンプレート パラメーターに関連付けます。
typedef Tr traits_type;
basic_streambuf::uflow
入力ストリームから現在の要素を抽出するプロテクト仮想関数。
virtual int_type uflow();
戻り値
現在の要素。
解説
プロテクト仮想メンバー関数は、現在の要素 ch を入力バッファーから抽出しようとし、現在のストリームの位置を進め、traits_type::to_int_type( ch) として要素を返します。 これはさまざまな方法で行うことができます。
読み取り位置が使用可能な場合は、読み取り位置に格納されている要素として ch を使用し、入力バッファーのネクスト ポインターを進めます。
いくつかの外部ソースから直接、要素を読み取り、それを値 ch として配付できます。
一般的な入力ストリームと出力ストリームがあるストリーム バッファーの場合、出力バッファーの先頭とネクスト ポインターの間の一部またはすべての要素をいくつかの外部の宛先に書き出すことで、読み取り位置を使用可能にすることができます。 または、入力バッファーに新しい記憶域または追加の記憶域を割り当てることができます。 その後、関数はいくつかの外部ソースから 1 つまたは複数の要素を読み取ります。
関数が成功しない場合は、 traits_type::eof を返すか、例外をスローします。 それ以外の場合、上記のように変換された入力ストリームの現在の要素 ch
を返して、入力バッファーのネクスト ポインターを進めます。 既定の動作では、underflow を呼び出し、その関数が traits_type::eof を返す場合は、traits_type::eof を返します。 それ以外の場合、関数は上記のように変換された入力ストリームの現在の要素 ch を返して、入力バッファーのネクスト ポインターを進めます。
basic_streambuf::underflow
入力ストリームから現在の要素を抽出するプロテクト仮想関数。
virtual int_type underflow();
戻り値
現在の要素。
解説
プロテクト仮想メンバー関数は、現在のストリームの位置を進めずに現在の要素 ch を入力ストリームから抽出しようとし、それを traits_type::
to_int_type( ch) として返します。 これはさまざまな方法で行うことができます。
読み取り位置が使用可能な場合、ch は読み取り位置に格納されている要素です。 詳細については、basic_streambuf クラスの「コメント」セクションを参照してください。
新しい記憶域または追加の記憶域を入力バッファーに割り当てた後に、いくつかの外部ソースから 1 つまたは複数の要素を読み取ることで、読み取り位置を使用可能にすることができます。 詳細については、basic_streambuf クラスの「コメント」セクションを参照してください。
関数が成功しない場合は、 traits_type::
eof()
を返すか、例外をスローします。 それ以外の場合、上記のように変換された入力ストリームの現在の要素が返されます。 既定の動作では、traits_type::eof()
が返されます。
仮想 underflow
関数は sync 関数と overflow 関数とともに、streambuf
から派生したクラスの特性を定義します。 派生した各クラスは、underflow
を異なる方法で実装できますが、呼び出すストリーム クラスとのインターフェイスは同じです。
underflow
関数は、get 領域が空のときに sgetc や sgetn のようなパブリック streambuf
関数で最も頻繁に呼び出されますが、ストリーム クラスなどのその他のクラスはいつでも underflow
を呼び出すことができます。
underflow
関数は get 領域に入力ソースからの文字を提供します。 get 領域に文字が含まれている場合、underflow
は最初の文字を返します。 get 領域が空の場合、get 領域をいっぱいにして次の文字を返します (これは get 領域に残ります)。 これ以上使用できる文字がない場合には、underflow
は EOF
を返し、get 領域を空のままにします。
strstreambuf
クラスでは、underflow
は egptr ポインターを調整して、overflow
への呼び出しによって動的に割り当てられたストレージにアクセスします。
basic_streambuf::xsgetn
入力ストリームから要素を抽出するプロテクト仮想関数。
渡された値が正しいことの確認を呼び出し元に依存するため、このメソッドは安全ではない可能性があります。
virtual streamsize xsgetn(
char_type* ptr,
streamsize count);
パラメーター
ptr
抽出した文字を格納するバッファー。
count
抽出する要素数。
戻り値
抽出された要素の数。
解説
プロテクト仮想メンバー関数は、sbumpc を繰り返し呼び出すのと同じように、最大 count の要素を入力ストリームから抽出し、それらを ptr で始まる配列に格納します。 抽出された要素の数を返します。
basic_streambuf::xsputn
出力ストリームに要素を挿入するプロテクト仮想関数。
virtual streamsize xsputn(const char_type* ptr, streamsize count);
パラメーター
ptr
挿入する要素へのポインター。
count
挿入する要素の数。
戻り値
ストリームに挿入された要素の数。
解説
プロテクト仮想メンバー関数は、sputc を繰り返し呼び出すのと同じように、ptr で始まる配列から最大 count の要素を出力ストリームに挿入します。 出力ストリームへの文字の挿入は、すべての count 文字が書き込まれるか、sputc( count)
の呼び出しが traits::eof()
を返すと停止します。 挿入された要素の数を返します。