マニュアルページ ostream.3




名前

     ostream - 書式つき / 書式なし出力


形式

     #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 の各メンバー 関 数 を
     mutex ロックを使用することにより、マルチスレッド環境での安全
     性を保証します。MT-safe クラスを使用するだけでは、マル チ ス
     レッド環境で使用しても安全なアプリケーション動作は保証されま
     せん。同時に稼働している複数のスレッド間で入出力スト リー ム
     ・オブジェクトを共有することの詳細については、『C++ ライブラ
     リ・リファレンス』の 4 章「マルチスレッド環境での従 来 型 の
     iostream ライブラリの使用」を参照してください。

  コンストラクタと代入
     ostream(sbufp)
          sbufp が指す streambuf をストリームに対応づけ、ios 状態
          を初期化します。

     ostream_withassign()
          初期化を行いません。

     ostream_withassign osw = sbufp
          sbufp が指す streambuf を osw に対応づけ、osw を完全 に
          初期化します。

     ostream_withassign osw = ostr
          ostr に対応する streambuf を osw に対応づけ、osw を完全
          に初期化します。

     注意:
          ostream_withassign クラスのローカルオブジェクトは必ず初
          期化してください。

  ワイド文字のサポート
     ストリームにワイド文字を出力するすべての操作においては、現在
     の ロ ケー ル の 複 数 バ イト表現に従っていない文字があると
     ios::failbit がセットされ、出力が停止します。また、ワイド 文
     字の出力時には常に opfx() が呼び出されます。

  出力用接頭辞 /
  接尾辞関数
     int i = ostr.opfx()
          すべての挿入操作に共通の準備を行います。ostr のエラー状
          態 が ゼロ以外のとき、opfx は直ちにゼロを返します。スト
          リームが ostr に結合されていれば (ios(3CC4) の tie を参
          照)、そのストリームはフラッシュします。関数 opfx の戻り
          値は、何らかのエラーが検出された場合はゼロ、それ以外 の
          場 合はゼロ以外です。挿入関数を独自に定義する場合は、最
          初に opfx を呼び出してください。

     ostr.osfx()
          挿入操作のまとめの処理を行います。ios::unitbuf がセット
          さ れていれば、ストリームをフラッシュします。ios::stdio
          がセットされていれば、stdout と stderr をフラッシュしま
          す (ios(3CC4) 参照)。戻り値はありません。定義済みの挿入
          関数はすべて osfx を呼び出しますが、書式なし出力関数 は
          こ の 呼 び出しを行いません。挿入関数を独自に定義する場
          合、制御を戻す前に osfx を呼び出してください。

  書式つき出力 (挿入) 関数
     書式つき出力関数は opfx() を呼び出します。opfx() の戻り値 が
     ゼ ロのとき、それ以上の処理は行いません。また、opfx() が正常
     終了した場合、制御を戻す前に osfx() を呼び出します。

     ostr << sbufp
          ostr.opfx() の戻り値がゼロ以外のと き、 sbufp  が 指 す
          streambuf  から抽出できるすべての文字を ostr に挿入しま
          す。パディングは行いません。戻り値は ostr への 参 照 で
          す。 この関数を使用すればストリームを効率よくコピーでき
          ますが、その場合にコピー先とコピー元のストリームがと も
          に結合されていないことを確かめる必要があります。

          使用例 :
               #include <iostream.h>
               main()
               {   // cin に cout をコピー
                   cin.tie(0);
                   cout.tie(0);
                   cout << cin.rdbuf(); // rdbuf については ios(3CC4) を参照
                   return 0;
               }

     ostr << x
          ostr.opfx(0) の戻り値がゼロ以外のとき、x を表している文
          字を ostr に挿入します。opfx の戻り値がゼロのときは何も
          行いません。検出されたエラーはすべて ostr のエラー状 態
          に 記録されます。これらの関数は常に ostr への参照を返し
          ます。独自の関数を定義する場合は、次の形式に従ってく だ
          さい。
               ostream& operator<< (ostream&, SomeType)
          さらに、上記の原則に従う必要があります。

          x の型と ostream の書式状態 (ios(3CC4) 参照) により、変
          換 と 挿 入 の 具体的な内容が決定します。これらの関数は
          ostream の状態を変更しません。ただし、変数 width は、書
          式 つきの挿入が行われるたびにゼロに再設定されます。定義
          済みの書式つき挿入関数とその変換規則は次のとおりです。

     char, unsigned char, signed char
          文字 x を変換しないで ostr に挿入します。

     wchar_t
          ワイド文字を複数バイト表現に変換し、ストリームに挿入 し
          ます。ios::failbit をセットし、ワイド文字が現在のロケー
          ルの複数バイト表現を持っていない場合は停止します。

     short, unsigned short
     int, unsigned int
     long, unsigned long
          これらの型は、先頭にゼロのない数字の列で表現されま す。
          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'' が付けられます。

     float, double
          x  の 値  は   precision、  width、   ios::scientific、
          ios::fixed、  ios::uppercase の現在の値に従って変換され
          ます。ios(3CC4) を参照してください。

     char*
          x が指す位置から最初の NULL (0) 文字までの文字の列で 表
          現されます。ただし、NULL 文字は含みません。

     wchar_t*
          最初のワイド文字 0 までの配列に格納されたワイド文字の複
          数 バイト表現を挿入します。現在のロケールの複数バイト表
          現に従っていないワイド文字があれば、ios::failbit をセッ
          ト して停止します。パディングは、バイト単位でなく、文字
          単位のフィールド幅にもとづいて行われます。現在の実装 で
          は、パディング文字は常に単一バイトです。

     void*
          このポイン タ は、 そ の デー タ 型 が  int  で あ り、
          ios::showbase  と ios::hex がセットされている場合と同様
          に変換されます。

  書式なし出力 (挿入) 関数
     これらの関数は、opfx() や osfx() を呼び出しません。

     ostr.put(c)
          文字 c を ostr に挿入します。操作に失敗した場合はエラー
          状態をセットします。戻り値は常に ostr です。

     ostr.put(wc)
          ワイド文字の複数バイト表現を ostr に入れます。操作に 失
          敗した場合はエラー状態をセットします。戻り値は常に ostr
          です。

     ostr.write(ptr, len)
          ptr が指す char 型配列の先頭から len 文字を正確に  ostr
          に 挿入します。操作に失敗した場合はエラー状態をセットし
          ます。戻り値は常に ostr です。

     ostr.write(wptr, len)
          wptr が指す文字を先頭に、len で指定された数のワイド文字
          を複数バイト表現で ostr に挿入します。

  位置決め関数
     これらの関数は ostream に対応する streambuf の出力ポインタを
     操 作します。詳細については、 sbufpub(3CC4) を参照してくださ
     い。複数バイト入力操作を行なった場合、tellg() で取得した値が
     streambuf の入力ポインタと異なる場合があります。しかし、その
     場合でも、istream 上ではすべての操作とシークが正しく同期しま
     す。

     ostr.seekp(pos)
     ostr.seekp(off, dir)
          出力ポインタの位置を設定し、ostr への参照を返します。

     streampos pos = ostr.tellp()
          出力ポインタの現在の位置を返します。

  その他の関数
     ostr.flush()
          対応する streambuf に格納されているすべての文字をフラッ
          シュします (たとえば、出力ファイルに書き込みます)。戻り
          値は ostr への参照です。

  定義済みマニピュレータ
     マニピュレータは、外見上、挿入または抽出されたオブジェクトと
     して使用されることがありますが、実際はストリームの状態を変更
     するだけです。詳細については、 manip(3CC4) と ios(3C++) を参
     照してください。出力ストリーム用に、以下のマニピュレータが定
     義されています。

     ostr << manip
          manip(ostr) の呼び出しと等価です。

     ostr << dec
          ostr の変換基数を 10 に設定します。

     ostr << oct
          ostr の変換基数を 8 に設定します。

     ostr << hex
          ostr の変換基数を 16 に設定します。

     ostr << endl
          改行を挿入して 1 つの行を終了し、ostr をフラッシュし ま
          す。

     ostr << ends
          ostr に NULL (0) 文字を挿入して文字列を終了します。

     ostr << flush
          ostr.flush() の呼び出しと等価です。


関連項目

     ios.intro(3CC4)、 ios(3CC4)、 manip(3CC4)、 sbufpub(3CC4)、
     『C++ ライブラリ・リファレンス』の第 3 章「iostream ライブラ
     リ」および第 4 章「マルチスレッド環境での従来型の iostream
     ライブラリの使用」