#include <iostream.h> typedef long streampos; typedef long streamoff; class unsafe_ios { public: // エクスポートされた型
// ストリーム操作モード enum open_mode { in = 0x01, // 読み取りのためにオープン out = 0x02, // 書き込みのためにオープン ate = 0x04, // 最初のオープン時に EOF までシーク app = 0x08, // 追加モード: EOF にすべて追加 trunc = 0x10, // ファイルがすでに存在する場合ファイルを切り捨て nocreate = 0x20, // ファイルが存在しない場合オープンが失敗 noreplace= 0x40 // ファイルがすでに存在する場合オープンが失敗 };
// ストリームシーク方向 enum seek_dir { beg=0, cur=1, end=2 };
// 書式設定フラグ enum { skipws = 0x0001, // 入力の空白を読み飛ばす left = 0x0002, // 左揃えで出力 right = 0x0004, // 右揃えで出力 internal = 0x0008, // 符号や基数指示子の後ろのパディング dec = 0x0010, // 10 進数変換 oct = 0x0020, // 8 進数変換 hex = 0x0040, // 16 進数変換 showbase = 0x0080, // 基数指示子を出力 showpoint = 0x0100, // 小数点を強制的に使用 (浮動小数点型の出力) uppercase = 0x0200, // 16 進数を大文字で出力 showpos = 0x0400, // 正の整数に '+' を追加 scientific= 0x0800, // 1.2345E2 浮動小数点表記を使用 fixed = 0x1000, // 123.45 浮動小数点表記を使用 unitbuf = 0x2000, // 挿入後すべてのストリームをフラッシュ stdio = 0x4000 // 挿入後、標準出力や標準エラーをフラッシュ };
// 残りについては ios(3CC4) を参照... }; class unsafe_ostream : virtual public unsafe_ios { public: // エクスポートされた関数 // 書式なし出力関数 unsafe_ostream& put(char c); unsafe_ostream& write(const char* ptr, int len); // ワイド文字 unsafe_ostream& put(wchar_t wc); unsafe_ostream& write(const wchar_t * wptr, int len); // その他の関数 int opfx(); void osfx(); unsafe_ostream& flush(); unsafe_ostream& seekp(streampos pos); unsafe_ostream& seekp(streamoff offset, unsafe_ios::seek_dir from); streampos tellp(); public: // エクスポートされた演算子関数 unsafe_ostream& operator<< (char); unsafe_ostream& operator<< (unsigned char); unsafe_ostream& operator<< (short); unsafe_ostream& operator<< (unsigned short); unsafe_ostream& operator<< (int); unsafe_ostream& operator<< (unsigned int); unsafe_ostream& operator<< (long); unsafe_ostream& operator<< (unsigned long); unsafe_ostream& operator<< (float); unsafe_ostream& operator<< (double); unsafe_ostream& operator<< (const char* buf); unsafe_ostream& operator<< (void* ptr); unsafe_ostream& operator<< (streambuf* sbufp); unsafe_ostream& operator<< (unsafe_ostream& (*manip)(unsafe_ostream&)); unsafe_ostream& operator<< (unsafe_ios& (*manip)(unsafe_ios&)); public: // ワイド文字 unsafe_ostream& operator<< (wchar_t); unsafe_ostream& operator<< (const wchar_t*); public: // エクスポートされたコンストラクタ unsafe_ostream(streambuf* sbufp); }; class ostream : virtual public ios, public unsafe_ostream { public: // 書式なし出力関数 ostream& put(char); ostream& write(const char* ptr, int n); ostream& write(const unsigned char* ptr, int n); // ワイド文字 ostream& put(wchar_t); ostream& write(const wchar_t *, int);
// その他の関数 int opfx(); int osfx(); ostream& flush(); ostream& seekp(streampos); ostream& seekp(streamoff, seek_dir); streampos tellp(); public: // エクスポートされた演算子関数 ostream& operator<<(char); ostream& operator<<(unsigned char); ostream& operator<<(short); ostream& operator<<(unsigned short); ostream& operator<<(int); ostream& operator<<(unsigned int); ostream& operator<<(long); ostream& operator<<(unsigned long); ostream& operator<<(float); ostream& operator<<(double); ostream& operator<<(const char*); ostream& operator<<(void*); ostream& operator<<(streambuf*); ostream& operator<<(ostream& (*)(ostream&)); ostream& operator<<(ios& (*)(ios&)); public: // ワイド文字 ostream& operator<< (wchar_t); ostream& operator<< (const wchar_t*); public: // エクスポートされたコンストラクタ ostream(streambuf* sbufp);
}; class ostream_withassign : public ostream { public: ostream_withassign(); ostream_withassign& operator= (ostream& ostr); ostream_withassign& operator= (streambuf* sbufp); }; extern ostream_withassign cout; extern ostream_withassign cerr; extern ostream_withassign clog; ios& dec(ios&); ios& hex(ios&); ios& oct(ios&); ostream& endl(ostream&); ostream& ends(ostream&); ostream& flush(ostream&); unsafe_ios& dec(unsafe_ios&) ; unsafe_ios& hex(unsafe_ios&) ; unsafe_ios& oct(unsafe_ios&) ; unsafe_ostream& endl(unsafe_ostream& i) ; unsafe_ostream& ends(unsafe_ostream& i) ; unsafe_ostream& flush(unsafe_ostream&) ;
クラス ostream は、関連付けられた streambuf への書式付きおよび書式なしのデータの挿入 (出力) をサポートします。
クラス unsafe_ostream は、次に示す機能のすべてを実装しますが、複数のスレッドによる同時アクセスを保護しません。クラス ostream は、unsafe_ostream の各メンバー関数に相互排他ロックを実装して、MT-安全性を確保する「ラッパー」クラスです。MT-安全クラスを使用するだけでは、アプリケーションによる MT-安全な動作は保証されません。連携するスレッド間での iostream オブジェクトの共有の詳細については、『C++ ライブラリリファレンス』の第 4 章「マルチスレッド環境での従来型の iostream ライブラリの使用」を参照してください。
sbufp が指す streambuf をストリームに関連付け、ios 状態を初期化します。
初期化を実行しません。
sbufp が指す streambuf を osw に関連付け、osw を完全に初期化します。
ostr に関連付けられた streambuf を osw に関連付け、コンストラクタは osw を完全に初期化します。
注: クラス ostream_withassign のローカルオブジェクトは初期化する必要があります。
ストリームにワイド文字を出力するすべての操作で、現在のロケールでの複数バイト表現をしていないワイド文字を検出すると ios::failbit を設定し、出力が停止します。それらはすべて opfx() を呼び出します。
すべての挿入操作に共通の設定を実行します。ostr のエラー状態がゼロ以外の場合、opfx はただちにゼロを返します。ストリームが ostr に結合され (ios3CC4() の tie を参照)、結合されているストリームはフラッシュされます。関数 opfx は、何らかのエラー状況が検出された場合はゼロ、それ以外の場合はゼロ以外を返します。ユーザー定義のインサータは opfx の呼び出しから始めてください。
挿入操作の終わりにフォローアップアクションを実行します。ios::unitbuf が設定されている場合、ストリームをフラッシュします。ios::stdio が設定されている場合、stdout と stderr をフラッシュします。(ios(3CC4) を参照してください)。戻り値はありません。定義済みのすべてのインサータは osfx を呼び出しますが、書式なし出力関数は呼び出しません。ユーザー定義のインサータは戻る前に、opfx を呼び出してください。
書式付き出力関数は opfx() を呼び出します。ゼロを返す場合は、それ以上のアクションを行いません。この関数も戻る前に osfx()を呼び出します (opfx() が成功した場合)。
ostr.opfx() がゼロ以外を返す場合、sbufp が指す streambuf から抽出できるすべての文字を ostr に挿入します。パディングは実行されません。ostr への参照を返します。この関数を使用して、ストリームを効率的にコピーできますが、どちらのストリームも結合されていないことを確認してください。例:
#include <iostream.h> main() { // copy cin to cout cin.tie(0); cout.tie(0); cout << cin.rdbuf(); // see ios(3CC4) for rdbuf return 0; }
ostr.opfx(0) がゼロ以外を返す場合、x を表している文字を ostr に挿入します。opfx がゼロを返す場合は何のアクションも行いません。検出されたエラーはすべて ostr のエラー状態で記録されます。これらの関数は常に ostr への参照を返します。ユーザー作成の関数は次の書式にし、
ostream& operator<< (ostream&, SomeType)
また、これらの原則に従ってください。
x の型と ostream の書式状態 (ios(3CC4) を参照) により、変換と挿入の詳細が決まります。これらの関数は ostream の状態を変更しませんが、書式付きの挿入後に、width 変数がゼロにリセットされます。定義済みの書式付きインサータとそれらの変換規則は次のとおりです。
文字 x を変換しないで ostr に挿入します。
ワイド文字を複数バイト表現に変換し、ストリームに挿入します。ios::failbit を設定し、ワイド文字が現在のロケールでの複数バイト表現を持っていない場合は停止します。
この表現は、先頭にゼロのない数字のシーケンスから構成されます。数字と変換は、ios::oct が設定されている場合は 8 進数、ios::hex が設定されている場合は 16 進数、ios::dec が設定されているか、これらのどれも設定されていない場合は 10 進数です。10 進数変換の場合、x が正で、ios::showpos が設定されている場合、先頭にプラス符号 (+) があります。x が負の場合は先頭にマイナス符号 (-) があります。8 進数変換と 16 進数変換は「符号なし」として処理され、符号は含まれません。ios::showbase が設定されている場合、8 進数変換の場合は先頭に「0」、16 進数変換の場合は ios::uppercase が設定されているかどうかによって、先頭に「0x」または「0X」があります。
x の値は precision、width、ios::scientific、ios::fixed、および ios::uppercase の ostr の現在の値に従って変換されます。 ios (3CC4) を参照してください。
この表現は x が指す文字から最初の NULL (0) 文字 (ただしこれを含まない) までの文字のシーケンスです。
最初の 0 ワイド文字までの配列に、ワイド文字の複数バイト表現を挿入します。現在のロケールでの複数バイト表現を持たないワイド文字を検出した場合は、ios::failbit を設定し、停止します。パディングは、バイトでなく、文字で測定されたフィールド幅にもとづきます。現在の実装では、充てん文字は常に単一バイトです。
このポインタは、int および ios::showbase および ios::hex が設定されている場合と同様に変換されます。
これらの関数は opfx() または osfx() を呼び出しません。
文字 c を ostr に挿入します。操作に失敗した場合はエラー状態を設定します。常に ostr への参照を返します。
ワイド文字のマルチバイト表現を ostr に挿入します。操作に失敗した場合はエラー状態を設定します。常に ostr への参照を返します。
ptr が指す char 配列の先頭から正確に len 文字を ostr に挿入します。操作に失敗した場合はエラー状態を設定します。常に ostr への参照を返します。
wptr が指す正確なカウントのワイド文字の複数バイト表現を ostr に挿入します。
これらは、ostream に関連付けられた streambuf の put ポインタを処理します。詳細については sbufpub(3CC4) を参照してください。複数バイト入力操作によって、streambuf の get ポインタが tellg() で報告された値と異なることがありますが、streambuf ではなく istream に対して実行されるシークは istream へのすべての操作と正しく同期します。
これらは put ポインタの位置を設定し、ostr への参照を返します。
これは put ポインタの現在の位置を返します。
これにより、関連付けられた streambuf に格納されるすべての文字がフラッシュされます。たとえば、出力ファイルに書き込まれます。ostr への参照を返します。
マニピュレータは、見掛け上、挿入または抽出されたオブジェクトとして使われることがありますが、多くはストリームの状態を変更するだけです。詳細については manip(3CC4) および ios(3CC4) を参照してください。ostreams で使用するために、いくつかのマニピュレータが事前定義されています。
これは manip(ostr) の呼び出しと等価です。
ostr の変換基数を 10 に設定します。
ostr の変換基数を 8 に設定します。
ostr の変換基数を 16 に設定します。
改行を挿入し、ostr をフラッシュして、1 行を終了します。
ostr に NULL (0) 文字を挿入して文字列を終了します。
これは ostr.flush() の呼び出しと等価です。
ios (3CC4) , ios.intro (3CC4) , manip (3CC4) , sbufpub (3CC4)
『C++ ライブラリリファレンス』の第 3 章「従来型の iostream ライブラリ」および第 4 章「マルチスレッド環境での従来型の iostreams ライブラリの使用」