strstreambuf クラス
char
配列オブジェクトに格納されている要素のシーケンスとの間で行う、要素の送信を制御するストリーム バッファーを表します。
構文
class strstreambuf : public streambuf
解説
オブジェクトの構築方法に応じて、シーケンスにおける変更に対応できるように割り当て、拡張、解放を必要に応じて行えます。
クラス strstreambuf
のオブジェクトは、strstreambuf
モードのモード情報が入っているいくつかのビットを格納します。 これらのビットは、制御対象シーケンスに関して次の情報を示します。
割り当てがなされていて、最終的に解放する必要があるかどうか。
変更可能かどうか。
記憶域の再割り当てによって拡張可能かどうか。
操作できないようにされていて、オブジェクトを破棄する前に操作できるようにする必要があるかどうか、またはオブジェクト以外のエージェンシーで解放する必要があるかどうか (割り当てがなされている場合)。
操作できないようにされている制御対象シーケンスは、これらの別個のモード ビットに関係なく、変更も拡張もできません。
またオブジェクトは、strstreambuf
割り当てを制御する 2 つの関数へのポインターも格納します。 これらが null ポインターである場合、オブジェクトは制御対象シーケンスに対して記憶域の割り当ておよび解放を行う独自のメソッドを考案します。
Note
このクラスは非推奨とされます。 代わりに stringbuf または wstringbuf を使用することを検討してください。
コンストラクター
コンストラクター | 説明 |
---|---|
strstreambuf | strstreambuf 型のオブジェクトを構築します。 |
メンバー関数
メンバー関数 | 説明 |
---|---|
freeze | ストリーム バッファーの操作により、ストリーム バッファーを使用不可にします。 |
overflow | いっぱいのバッファーに新しい文字が挿入されたときに呼び出すことができる、プロテクト仮想関数。 |
pbackfail | 要素を入力ストリームに戻してから、その要素を現在の要素 (ネクスト ポインターによって指される) にしようとするプロテクト仮想メンバー関数。 |
pcount | 被制御シーケンスに書き込まれる要素の数を返します。 |
seekoff | 制御対象ストリームの現在の位置を変更しようと試みるプロテクト仮想メンバー関数。 |
seekpos | 制御対象ストリームの現在の位置を変更しようと試みるプロテクト仮想メンバー関数。 |
str | freeze を呼び出し、被制御シーケンスの先頭へのポインターを返します。 |
underflow | 入力ストリームから現在の要素を抽出するプロテクト仮想関数。 |
要件
ヘッダー:<strstream>
名前空間: std
strstreambuf::freeze
ストリーム バッファーの操作により、ストリーム バッファーを使用不可にします。
void freeze(bool _Freezeit = true);
パラメーター
_Freezeit
ストリームを停止させるかどうか示す bool
。
解説
_Freezeit が true の場合、この関数によって格納されている strstreambuf
モードが変更され、被制御シーケンスが固定されます。 それ以外の場合、被制御シーケンスは固定されません。
str は freeze
を意味します。
Note
固定されたバッファーは、strstreambuf
の破棄中には解放されません。 メモリ リークを避けるために、バッファーを解放する前に固定解除する必要があります。
例
// strstreambuf_freeze.cpp
// compile with: /EHsc
#include <iostream>
#include <strstream>
using namespace std;
void report(strstream &x)
{
if (!x.good())
cout << "stream bad" << endl;
else
cout << "stream good" << endl;
}
int main()
{
strstream x;
x << "test1";
cout << "before freeze: ";
report(x);
// Calling str freezes stream.
cout.write(x.rdbuf()->str(), 5) << endl;
cout << "after freeze: ";
report(x);
// Stream is bad now, wrote on frozen stream
x << "test1.5";
cout << "after write to frozen stream: ";
report(x);
// Unfreeze stream, but it is still bad
x.rdbuf()->freeze(false);
cout << "after unfreezing stream: ";
report(x);
// Clear stream
x.clear();
cout << "after clearing stream: ";
report(x);
x << "test3";
cout.write(x.rdbuf()->str(), 10) << endl;
// Clean up. Failure to unfreeze stream will cause a
// memory leak.
x.rdbuf()->freeze(false);
}
before freeze: stream good
test1
after freeze: stream good
after write to frozen stream: stream bad
after unfreezing stream: stream bad
after clearing stream: stream good
test1test3
strstreambuf::overflow
いっぱいのバッファーに新しい文字が挿入されたときに呼び出すことができる、プロテクト仮想関数。
virtual int overflow(int _Meta = EOF);
パラメーター
_Meta
バッファーに挿入する文字または EOF
。
戻り値
関数が成功しない場合は、EOF
が返されます。 それ以外の場合、_Meta == EOF
であれば EOF
以外の値が返されます。 それ以外の場合は、_Meta が返されます。
解説
_Meta != EOF
の場合、プロテクト仮想メンバー関数は要素 (char)_Meta
を出力バッファーに挿入しようとします。 これはさまざまな方法で行うことができます。
書き込み位置が使用可能な場合は、書き込み位置に要素を格納し、出力バッファーの次のポインターをインクリメントできます。
格納されている strstreambuf モードによって被制御シーケンスが変更可能、拡張可能で、固定されていないことが示されている場合、この関数は出力バッファーに新規に割り当てることによって書き込み位置を使用可能にできます。 このように出力バッファーを拡張すると、関連付けられているすべての入力バッファーも拡張されます。
strstreambuf::p backfail
要素を入力ストリームに戻してから、その要素を現在の要素に (次のポインターによって指されるように) しようとするプロテクト仮想メンバー関数。
virtual int pbackfail(int _Meta = EOF);
パラメーター
_Meta
バッファーに挿入する文字または EOF
。
戻り値
関数が成功しない場合は、EOF
が返されます。 それ以外の場合、_Meta == EOF
であれば EOF
以外の値が返されます。 それ以外の場合は、_Meta が返されます。
解説
プロテクト仮想メンバー関数が要素を入力バッファーに戻そうと試み、その要素を現在の要素に (次のポインターによって指されるように) します。
_Meta == EOF
の場合、プッシュ バックする要素は、実質的に、現在の要素の前に既にストリーム内にある要素になります。 それ以外の場合、この要素は ch = (char)_Meta
によって置き換えられます。 この関数は、さまざまな方法で要素を戻すことができます。
戻り位置が使用可能であり、格納されている要素が
ch
に等しい場合、入力バッファーのネクスト ポインターをデクリメントできます。戻り位置が使用可能であり、strstreambuf モードによって被制御シーケンスが変更可能であることが示されている場合、この関数は
ch
を戻り位置に格納し、入力バッファーの次のポインターをデクリメントできます。
strstreambuf::p count
被制御シーケンスに書き込まれる要素の数を返します。
streamsize pcount() const;
戻り値
被制御シーケンスに書き込まれる要素の数。
解説
具体的には、pptr が Null ポインターの場合、この関数はゼロを返します。 それ以外の場合は、pptr
- pbase を返します。
例
// strstreambuf_pcount.cpp
// compile with: /EHsc
#include <iostream>
#include <strstream>
using namespace std;
int main( )
{
strstream x;
x << "test1";
cout << x.rdbuf( )->pcount( ) << endl;
x << "test2";
cout << x.rdbuf( )->pcount( ) << endl;
}
strstreambuf::seekoff
制御対象ストリームの現在の位置を変更しようと試みるプロテクト仮想メンバー関数。
virtual streampos seekoff(streamoff _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
パラメーター
_Off
シークする _Way の相対位置。
_Way
オフセット演算の開始位置。 有効値については、「seekdir」を参照してください。
_Which
ポインター位置のモードを指定します。 既定では、読み取り位置および書き込み位置を変更できます。
戻り値
いずれかまたは両方のストリームの位置を変更することで、関数が成功すると、結果のストリームの位置が返されます。 それ以外の場合は、失敗し、無効なストリームの位置が返されます。
解説
プロテクト仮想メンバー関数が、制御対象ストリームの現在の位置を変更しようと試みます。 クラス strstreambuf のオブジェクトの場合、ストリームの位置がストリーム オフセットのみで構成されます。 オフセット ゼロは、被制御シーケンスの最初の要素を指定します。
新しい位置は、次のように決定されます。
_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 以外であり、_Way != ios_base::cur
および出力バッファーが存在する場合、この関数は、次に読み取る位置に一致するように次に書き込む位置を設定します。
それ以外の場合、_Which & ios_base::out
が 0 以外であり、出力バッファーが存在する場合、この関数は次の位置を変更して出力バッファーに書き込みます。 それ以外の場合、配置操作が失敗します。 配置操作を正常に完了するためには、結果のストリームの位置が被制御シーケンス内になければなりません。
strstreambuf::seekpos
制御対象ストリームの現在の位置を変更しようと試みるプロテクト仮想メンバー関数。
virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
パラメーター
_Sp
シークする位置。
_Which
ポインター位置のモードを指定します。 既定では、読み取り位置および書き込み位置を変更できます。
戻り値
いずれかまたは両方のストリームの位置を変更することで、関数が成功すると、結果のストリームの位置が返されます。 それ以外の場合は、失敗し、無効なストリームの位置が返されます。 ストリームの位置が無効であることを確認するには、戻り値と pos_type(off_type(-1))
を比較します。
解説
プロテクト仮想メンバー関数が、制御対象ストリームの現在の位置を変更しようと試みます。 クラス strstreambuf のオブジェクトの場合、ストリームの位置がストリーム オフセットのみで構成されます。 オフセット ゼロは、被制御シーケンスの最初の要素を指定します。 新しい位置は、_Sp によって決定されます。
_Which
& ios_base::in が 0 以外であり、入力バッファーが存在する場合、この関数は入力バッファー内の次に読み取る位置を変更します。 _Which
& ios_base::out
が 0 以外であり、出力バッファーが存在する場合、この関数は、、次に読み取る位置に一致するように次に書き込む位置を設定します。 それ以外の場合、_Which
& ios_base::out
が 0 以外であり、出力バッファーが存在する場合、この関数は出力バッファー内の次に書き込む位置を変更します。 それ以外の場合、配置操作が失敗します。 配置操作を正常に完了するためには、結果のストリームの位置が被制御シーケンス内になければなりません。
strstreambuf::str
freeze を呼び出し、被制御シーケンスの先頭へのポインターを返します。
char *str();
戻り値
被制御シーケンスの先頭へのポインター。
解説
明示的に挿入しない場合、終端の null 要素は存在しません。
例
str の使用例は、「strstreambuf::freeze」を参照してください。
strstreambuf::strstreambuf
strstreambuf
型のオブジェクトを構築します。
explicit strstreambuf(streamsize count = 0);
strstreambuf(void (* alloc_func)(size_t),
void (* free_func)(void*));
strstreambuf(char* getptr,
streamsize count,
char* putptr = 0);
strstreambuf(signed char* getptr,
streamsize count,
signed char* putptr = 0);
strstreambuf(unsigned char* getptr,
streamsize count,
unsigned char* putptr = 0);
strstreambuf(const char* getptr,
streamsize count);
strstreambuf(const signed char* getptr,
streamsize count);
strstreambuf(const unsigned char* getptr,
streamsize count);
パラメーター
alloc_func
バッファー メモリの割り当てに使用される関数。
count
getptr で指し示されるバッファーの長さを指定します。 getptr が引数ではない場合 (最初のコンストラクター形式)、バッファーの提案される割り当てサイズ。
_Freefunc
バッファー メモリを解放するために使用する関数。
getptr
入力に使用するバッファー。
putptr
出力に使用するバッファー。
解説
最初のコンストラクターは、入力バッファー、出力バッファー、および strstreambuf 割り当てを制御するすべてのポインターに Null ポインターを格納します。 被制御シーケンスを変更および拡張できるように、ストアド strstreambuf モードに設定します。 また、提案される初期割り当てサイズとして count を受け入れます。
2 番目のコンストラクターは、ストレージを割り当てるために呼び出す関数へのポインターとしての alloc_func と、ストレージを解放するために呼び出す関数へのポインターとしての free_func を格納する点を除いて、最初のコンストラクターのように動作します。
3 つのコンストラクター:
strstreambuf(char *getptr,
streamsize count,
char *putptr = 0);
strstreambuf(signed char *getptr,
streamsize count,
signed char *putptr = 0);
strstreambuf(unsigned char *getptr,
streamsize count,
unsigned char *putptr = 0);
これらは、getptr が被制御シーケンスを保持するために使用する配列オブジェクトを指定する点を除いて、最初のコンストラクターのように動作します。 (そのため、null ポインターにすることはできません)。配列内の N 要素の数は、次のように決定されます。
(count> 0) の場合、N は count です。
(count == 0) の場合、N は
strlen((const char *) getptr )
です。(count< 0) の場合、N は INT_MAX です。
putptr が Null ポインターの場合、関数は次を実行することによって入力バッファーだけを確立します。
setg(getptr,
getptr,
getptr + N);
それ以外の場合、次を実行することによって入力と出力の両方のバッファーを確立します。
setg(getptr,
getptr,
putptr);
setp(putptr,
getptr + N);
この場合、putptr は間隔 [ getptr, getptr + N] 内である必要があります。
最後に、3 つのコンストラクターを示します。
strstreambuf(const char *getptr,
streamsize count);
strstreambuf(const signed char *getptr,
streamsize count);
strstreambuf(const unsigned char *getptr,
streamsize count);
すべて次と同様に動作します。
streambuf((char *)getptr, count);
ストアド モードによって被制御シーケンスが変更可能にも拡張可能にもならない点を除きます。
strstreambuf::underflow
入力ストリームから現在の要素を抽出するプロテクト仮想関数。
virtual int underflow();
戻り値
関数が成功しない場合は、EOF
が返されます。 それ以外の場合、上記のように変換された入力ストリームの現在の要素が返されます。
解説
プロテクト仮想メンバー関数は、現在の要素 ch
を入力バッファーから抽出しようとし、現在のストリームの位置を進め、要素として (int)(unsigned char)ch
を返します。 これは 1 つの方法でのみ実行可能です。読み取り位置が使用可能な場合は、読み取り位置に格納されている要素として ch
を使用し、入力バッファーの次のポインターを進めます。
関連項目
streambuf
C++ 標準ライブラリ内のスレッド セーフ
iostream プログラミング
iostreams の規則