Oracle Solaris Studio 12.4 Man Pages

印刷ビューの終了

更新: January 2015
 
 

ssbuf(3CC4)

名前

ssbuf - 文字配列用バッファークラス

形式

 
#include <strstream.h> // <iostream.h> を取り込む
class strstreambuf : public streambuf {
public:
          strstreambuf();
          strstreambuf(int n);
          strstreambuf(void* (*a)(long), void (*f)(void*));
          strstreambuf(char* _s, int, char* _strt=0);
          ~strstreambuf();
     void    freeze_unlocked(int = 1);
     void    freeze(int = 1);
     char*   str_unlocked();
     char*   str();
virtual int     doallocate();
virtual int     overflow(int);
virtual int     underflow();
virtual streambuf* setbuf(char*, int);
virtual streampos seekoff(streamoff, unsafe_ios::seek_dir, int);
};

説明

strstreambuf クラスは、文字の入力元または出力先として char 配列 (文字列) を使用するように、streambuf を特殊化したものです。文字は配列からフェッチ (入力) され、配列によって消費され (配列に書き込まれ) ます。streambuf の基本操作については、sbufprot(3CC4) および sbufpub(3CC4) で説明しています。get ポインタと put ポインタは接続された配列を指し、get ポインタまたは put ポインタの移動は、char* のインクリメントまたはデクリメントに対応します。

streambuf をマルチスレッド安全 (MT-安全) にする、つまりマルチスレッド環境で正しく機能できるようにするため、各パブリック (public) メンバー関数でロックが使用されています。パフォーマンスが重要なシングルスレッドアプリケーションで使用するために、ロックを使用しない代替の一連のパブリック (public) メンバー関数が導入されました。これらのメンバー関数は、接尾辞 _unlocked を追加して、元の関数と同じ名前を共有しています。MT-非安全である以外、メンバー関数は同一の機能を持ちます。詳細については、C++ 4.1 ライブラリリファレンスマニュアルのマルチスレッド環境における libCの使用に関する第 5 章を参照してください。

strstreambuf は、動的または静的の 2 つのモードのいずれかで使用できます。動的モードでは、配列が自動的に割り当てられ、任意の長さの文字列を収容するために必要に応じて拡張されます。追加の領域が必要になると、新しい予約領域が割り当てられ、古い配列からデータがそれにコピーされ、古い配列が削除されます。静的モードでは、ユーザーが提供した固定の配列が使用されますが、これは、新しいバッファーに移動したり変更したりすることはできず、自動的に削除されることもありません。動的な strstreambufフリーズさせる、つまり拡張不可にすることができます。フリーズしているかまたは静的な strstreambuf は、C スタイルの文字列を必要とする式で使用するために、char* に変換できます。フリーズしている動的な strstreambufフリーズを解除する (再度拡張可能にする) ことができます。

コンストラクタ

strstreambuf()

空の、動的な、フリーズしていない strstreambuf を構築します。文字列のための領域は、必要に応じて自動的に割り当てられます。最小数の文字が挿入されることが分かっている場合は、小さな配列の割り当てと解放が繰り返されることを避けるために、strstream(int) コンストラクタでバッファーを作成するか、setbuf() (下記参照) を使用してください。

strstreambuf(n)

n バイト以上の初期バッファーサイズで、空の、動的な、フリーズしていない strstreambuf を構築します。

strstreambuf(alloc, del)

空の、動的な、フリーズしていない strstreambuf を構築します。文字列のための領域は、必要に応じて自動的に割り当てられます。new および delete は使用されず、提供されている関数 allocdel が呼び出されます。関数 alloc は、割り当てるバイト数の long パラメータをとる必要があり、割り当てられた領域へのポインタ (void* 型)、または失敗時にゼロを返す必要があります。alloc が NULL の場合 new が使用されます。関数 delalloc から取得したポインタ値になる void* 型のパラメータをとる必要があり、その戻り型は void です。del が NULL の場合、delete が使用されます。このコンストラクタを使用する場合は、allocdel に互換性があることに注意する必要があります。

strstreambuf(ptr, len, putp)

ptr が指すバッファーを使用する静的な strstreambuf を構築します。len が正で、putp が NULL の場合は、ptr から始まる len バイトが使用されます。putp が NULL でない場合は、len は無視され、初期 get 領域は ptr から putp までになります。len がゼロの場合、ptr は NULL で終わる文字列を指していると見なされ、NULL バイトまでの領域 (NULL バイトは含まない) がバッファーとして使用されます。len が負の場合、バッファーは無制限の長さと見なされます。明らかに、これは危険なモードになる可能性があります。get ポインタは最初 ptr に設定されます。put ポインタは最初 putp に設定されます。putp が NULL の場合、格納はエラーとして処理されます。

例:

strstreambuf greeting("Hello, world!", 0, 0);

指定されたテキストで構成されるバッファーを作成します。データを上書きしたり、拡張したりすることはできません。

char *hi = "Hello, world!";
strstreambuf greeting(hi, 0, hi+7);

指定されたテキストで構成されるバッファーを作成します。データは「w」から「!」まで上書きできますが、拡張することはできません。

char *hi = "Hello, world!";
strstreambuf greeting(hi, 5, hi);

指定されたテキストで構成されるバッファーを作成します。データの「Hello」の部分は読み取ったり上書きしたりすることができます。バッファーの残りの部分にはアクセスできません。

メンバー関数

ssbuf.freeze(i)

i がゼロでない場合は、動的なバッファーをフリーズします。ゼロの場合は、バッファーのフリーズを解除します。strstreambuf が破棄されても、フリーズによって、バッファーの自動削除が妨げられます。また、バッファーの現在のサイズを超えた拡張も妨げられます。バッファーをフリーズして、そのバッファーが明示的にフリーズ解除されるまで信頼性を維持する、そのバッファーへのポインタをとることを許可したいと考えることがあります。動的なバッファーはフリーズを解除されると、自動的に拡張または削除されることがあります。静的なバッファーは自動的に拡張または削除されることがないため、フリーズは静的バッファーには関係ありません。フリーズは、バッファーを NULL 終端しません。

char* p = ssbuf.str()

ssbuf をフリーズし、バッファーの先頭へのポインタを返します。ssbuf が動的モードでもバッファーが空の場合、返されるポインタは NULL になることがあります。

streambuf* sbp = ssbuf.setbuf(ptr, len)

ptr が NULL でない場合、要求は無視されます。静的または動的な strstreambuf のバッファーを置き換えることはできません。ptr が NULL の場合、len の値が保存され、次の動的モードの割り当てで少なくとも len バイトが確保されます。(これは次の割り当てにのみ適用され、その後 len の値は破棄されます)。バッファーが拡張されようとしているとき、この関数を使用して、適切な大きさの割り当てを強制して、多数の小さな割り当てと解放のシーケンスの可能性を避けたいと考えることがあります。

関連項目

ios (3CC4) , ios.intro (3CC4) , sbufprot (3CC4) , sbufpub (3CC4) , strstream (3CC4)

C++ ライブラリリファレンス』の第 3 章「従来型の iostream ライブラリ」および第 4 章「マルチスレッド環境での従来型の iostreams ライブラリの使用」