マニュアルページ ios.intro.3




名前

     ios - 入出力ストリームの基本的な書式化


形式

     #include <iostream.h>
     class unsafe_ios {
     public:
          // 公開された型
             // ストリームの状態ビット

             enum io_state   {
                 goodbit  = 0x00,     // ビットは設定されていない: すべて良好
                 eofbit   = 0x01,     // EOF (ファイルの終り) に位置している
                 failbit  = 0x02,     // 最後の入出力操作に失敗
                 badbit   = 0x04,     // 無効な操作を行おうとした
                 hardfail = 0x80      // 回復不可能なエラー
                 };

             // ストリーム操作モード
             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   // 挿入後、標準出力や標準エラーを
                                      // フラッシュ
                 };

     public:
          // 公開された関数
          // 書式化に関する関数
          long flags();
          long flags(long bits);
          long setf(long setbits, long field);
          long setf(long setbits);
          long unsetf(long unsetbits);
          int  width();
          int  width(int len);
          char fill();
          char fill(char ch);
          int  precision(int len);
          int  precision();
          int     skip(int doskip); // 廃止
          // 状態に関する関数
          int  rdstate();
          int  eof();
          int  fail();
          int  bad();
          int  good();
          void clear(int state=0);
          // その他の関数
          ostream* tie(ostream* tiedstream);
          ostream* tie();
          streambuf* rdbuf();
          static    long bitalloc();
          static    int  xalloc();
          long &    iword(int index);
          void* &   pword(int index);
          static    void sync_with_stdio();
     public:
          // 公開された演算子と変換関数
               operator void* ();
          int  operator ! ();
     public:
          // 公開されたコンストラクタとデストラクタ
          unsafe_ios(streambuf* sbp);
          virtual ~unsafe_ios();
     public:
          // 公開されたデータメンバー
          static    const long basefield;    // 10 進 | 8 進 | 16 進
          static    const long adjustfield;  // 左 | 右 | 中央
          static    const long floatfield;   // 科学表記 | 固定小数点表記
     protected:
          // 限定公開関数
          void init(streambuf* sbp);
          // 限定公開コンストラクタ
          unsafe_ios();
          void setstate (int);
          static void (*stdioflush)();
     private:
          // 非公開メンバー  (コピーを防止するため)
          unsafe_ios(unsafe_ios&);
          void    operator= (unsafe_ios&);
     };
     class ios : virtual public unsafe_ios, public stream_MT {
     public:
          // 書式に関する関数
          long            flags();
          long            flags(long);
          long            setf(long setbits, long field);
          long            setf(long);
          long            unsetf(long);
          int             width();
          int             width(int);
          char            fill();
          char            fill(char);
          int             precision();
          int             precision(int);
          // 状態に関する関数
          int             rdstate();
          int             eof();
          int             fail();
          int             bad();
          int             good();
          void            clear(int state =0);
          // その他の関数
          ostream*        tie();
          ostream*        tie(ostream*);
          streambuf*      rdbuf();
          static long     bitalloc();
          static int      xalloc();
          long&           iword(int);
          void* &         pword(int);
          static void     sync_with_stdio();
     public:
          // 公開された演算子と変換関数
                    operator void*();
          int             operator!();
     public:
          // 公開された演算子と変換関数
                    ios(streambuf* sbp);
                    virtual ~ios();
     protected:
                    init(streambuf* sbp);
                    ios();
                    setstate(int);
          static void     (*stdioflush)();
     protected:
          static  stream_rmutex static_mutlock;
          static int      mutex_init_count;
     private:
                    ios(ios&);

          void            operator=(ios&) ;
     };

     // 定義済みマニピュレータ
     unsafe_ostream& endl(unsafe_ostream&);
     unsafe_ostream& ends(unsafe_ostream&);
     unsafe_ostream& flush(unsafe_ostream&);
     ostream& endl(ostream&);
     ostream& ends(ostream&);
     ostream& flush(ostream&);
     unsafe_ios& dec(unsafe_ios&);
     unsafe_ios& hex(unsafe_ios&);
     unsafe_ios& oct(unsafe_ios&);
     ios& dec(ios&);
     ios& hex(ios&);
     ios& oct(ios&);
     unsafe_istream& ws(unsafe_istream&);
     istream& ws(istream&);


機能説明

     クラス ios は全ストリーム・オブジェクトの仮想基底クラス で、
     ストリームの基本状態と書式化データを提供します。いくつかの列
     挙型と多くの関数が定義されています。それらを以下で説明 し ま
     す。

     クラス unsafe_ios はこのクラスの持つ機能をすべて実装していま
     す。 クラス ios は「ラッパー」クラスであり、相互排他 (mutex)
     ロックを unsafe_ios の各メンバー関数に実装することによって、
     複数のスレッドによるアクセスから保護します。しかし、限定公開
     クラスを使用した場合のマルチスレッド環境での安全性は保証され
     て い ません。マルチスレッド環境で使用しても安全な (MT-safe)
     アプリケーションを作成する方法については『C++ ライブラリ・リ
     ファレンス』の 4 章「マルチスレッド環境での従来型の iostream
     ライブラリの使用」を参照してください。

  列挙型
     io_state
          このクラスのメンバー関数は、以下の列挙を用いてスト リー
          ム のエラー状態を追跡します。ビットのテスト方法について
          は、後述の「エラー状態」も参照してください。実際に は、
          io_state は次に示すビットの集まりです。
          goodbit
               このビットは、実際にはどのエラービットもセットされ
               ていない状態で、ストリームの状態が良好であることを
               示します。
          eofbit
               このビットは通常、抽出中にファイルの終端に到達する
               とセットされます。抽出が正常に行われた場合、ファイ
               ルの終端に達してもこのビットはセットされません。抽
               出の途中でファイルの終端に達した場合にセットされま
               す。この場合の「ファイルの終端」とは、そのストリー
               ム に対応する streambuf で定義されている抽象的な表
               現です。通常、このビットは出力ストリームに対しては
               セットされません。
          failbit
               抽出または変換が通常は予期しない文字によって失敗す
               ると、このビットがセットされます。それ以後このビッ
               トがクリアされるまでは、抽出を試みても失敗します。
               これは、不正な入力が行われた後に動作が続けられるこ
               とを避けるためです。通常、ストリーム自体は続けて使
               用可能であり、ビットをクリアして不正な入力データを
               処理すれば、抽出を再開することができます。
          badbit
               対応する streambuf 上で、ある操作に失敗したこと を
               示 し ます。通常、このビットがいったんセットされる
               と、それをクリアした後でも操作を行うことができませ
               ん。例として、出力エラーや、入力を試みた直後にファ
               イルの終端が検出された場合などがあります。
          hardfail
               このビットは、ストリームがそれ以上使用できないこと
               を示すために、実装によって予約されています。通常、
               ある種のハードウェア障害を表します。どこからもアク
               セスできる関数では、このビットをクリアすることはで
               きません。

     open_mode
          これらの列挙については、 fstream(3CC4) の関数 open() を
          参照してください。

     seek_dir
          これらの列挙については、 sbufpub(3CC4) の関数 seekoff()
          を参照してください。

     
          メンバー関数は、これらの無名型の列挙を用いて入出力の 書
          式 化 を 制御します。後述の「書式制御」を参照してくださ
          い。

  コンストラクタと
  代入演算子
     ios(sbp)
          sbptr が指すストリームバッファは、作成しようとしてい る
          ios  に 対応するストリームバッファとなります。 sbp に、
          NULL ポインタを指定しないでください。

     ios() // 
     init(sbp) // 
          これまで、仮想基底クラスにはデフォルトのコンストラク タ
          ( 引 数を持たないもの) が必要でした。仮想基底クラスの場
          合、コンストラクタに引数を渡す方法がなかったためで す。
          そこで、クラス ios はデフォルトのコンストラクタを持ち、
          それとは別に、 streambuf を指すポインタを引数とする初期
          化 関数を持っています。派生クラスは、デフォルトで限定公
          開のコンストラクタ  ios()  を 使 用 し、 初 期 化 関 数
          init(streambuf*) を呼び出します。 init の引数は、作成中
          の ios に対応づけるストリームバッファを指すポイン タ で
          す。NULL ポインタを指定しないでください。例を示します。
               class istream : virtual public ios { ... };
               istream::istream(streambuf* s)
               {
                   ios::init(s);
                   // ...
               }

     ios(iosref) // 
     stream2=stream1 // 
          コピーコンストラクタと代入演算子は、 ios オブジェクトの
          コ ピーを防止するために「非公開」です。これは、そのよう
          なコピーの影響が十分に定義されていないためで す。 通 常
          は、 オブジェクトを指すポインタをコピーするか、関数に参
          照を渡すようにします。

  エラー状態
     次のように、いくつかの関数によってエラー状態ビットのテストや
     調整を行うことができます。

     int i = s.rdstate()
          ストリーム s のエラー状態ビットを int 型の値として返 し
          ます。

     s.clear(state)
          指定された int 型のパラメタを、ストリーム s のエラー 状
          態 として格納します。 state の値は、 rdstate の戻り値、
          および io_state ビットの組み合わせの一方または両方か ら
          導 き 出 されたものでなければなりません。ストリーム状態
          ビット列の 1 つのビットだけを ク リ ア す る 場 合 は、
          s.clear(~ios::failbit & s.rdstate());  などを使用してく
          ださい。

     int i = s.good()
          エラー状態が「良好」、すなわちどのビットもセットされ て
          い なければ、ゼロ以外の値を返します。それ以外の場合はゼ
          ロを返します。特に、 eofbit がセットされている場合は ゼ
          ロを返します。

     int i = s.eof()
          eofbit がセットされていればゼロ以外の値を返し、セットさ
          れていなければゼロを返します。

     int i = s.fail()
          failbit、 badbit、 hardfail のいずれかがセットされて い
          れ ば、ゼロ以外の値を返します。これらのどのビットもセッ
          トされていない場合はゼロを返します。

     int i = s.bad()
          badbit または hardfail のどちらかがセットされていればゼ
          ロ 以外の値を返します。どちらのビットもセットされていな
          い場合はゼロを返します。

  その他の状態テスト
     ストリームの状態を直接テストできれば便利なことがよくあ り ま
     す。代表的な挿入演算子や抽出演算子はストリームへの参照型を返
     すため、実行した演算の戻り値をテストすることができます。この
     よ うなテストを可能にするために、次の 2 つの演算子が定義され
     ています。

     operator void* ()
          ストリームを void* に明示的にキャストするか、ストリーム
          を ブール (論理) 値の文脈の中で使用すれば、そのストリー
          ムの状態をテストできます。 failbit、 badbit、  hardfail
          のいずれかがセットされていれば、結果は 0 になります。ス
          トリームの状態が「良好」または eof であれば、結果はゼロ
          以外のポインタになります。例を示します。
               if( cout ) ...      // 次の出力は成功するであろう
               if( cin >> x ) ...       // x への入力は成功した

     operator ! ()
          この演算子は、上記のテストの逆を行います。すなわち、 結
          果は、 failbit、 badbit、 hardfail のいずれかがセットさ
          れていればゼロ以外、それ以外の場合にゼロとなります。 例
          を示します。
               if( ! cout ) ...         // 出力は成功しないであろう
               if( ! (cin >> x) ) ...        // x への入力は失敗した

  書式制御
     ios は、書式化フラグによって制御される 「書 式 状 態 」 と、
     fill()、width()、precision() の 3 つの関数を保持します。書式
     化フラグは以下に示すビットの集まりで、無名型の列挙として宣言
     されています。書式状態ビットは long int の値として保持され、
     関数 flags() の 2 つのバージョンを介して個別に操作できます。

     書式化フラグは、他の操作から独立してセットおよびクリアできま
     す。フラグは、プログラマの明示的なアクションによってのみ変化
     します。フラグは次のとおりです。

     skipws
          このフラグがセットされていると、書式つき抽出演算で入 力
          デー タの先頭の空白類が読み飛ばされます。セットされてい
          ない場合、先頭の空白類がそのまま読み込まれます。デ フォ
          ル トではセットされ、自由な書式の入力が可能です。書式な
          しの抽出演算では、このフラグはチェックされません。

     left
     right
     internal
          書式つき演算でパディングをどのように行うかを設 定 し ま
          す。3 つのフラグは、1 度に 1 つしかセットできません。静
          的メンバー ios::adjustfield を使用すれば、3 つのフラ グ
          を まとめて操作することができます。 left がセットされて
          いると、値はフィールドに左詰めで挿入されます。 す な わ
          ち、パディングは右側に行われます。 right がセットされて
          いると、値はフィールドに右詰めで挿入されます。 す な わ
          ち、 パディングは左側に行われます。 internal がセットさ
          れていると、先頭の底または符号のフィールドと値との間 に
          パ ディングが行われます。パディング文字 (デフォルトでは
          空白文字を使用) は、関数 fill によって設定できます。 ど
          の フ ラ グ も セットされていない場合 (デフォルト) は、
          right が想定されます。パディングの量は、関数  width  に
          よっ て 設 定 さ れ る フィールド幅によって決定します。
          manip(3CC4) も参照してください。

     dec
     oct
     hex
          整数データの変換基数を設定します。3 つのフラグは、1  度
          に  1  つ し か セッ ト で き ま せ ん。 静 的 メンバー
          ios::basefield を使用すれば、3 つのフラグをまとめて操作
          することができます。 dec がセットされていると 10 進数 (
          基数 10)、 oct がセットされていると 8 進数 (基 数  8)、
          hex がセットされていると 16 進数 (基数 16) で変換が行わ
          れます。どのフラグもセットされていない場合、挿入 は  10
          進 数 で 行われ、抽出したデータは整定数を表現するための
          C++ の規則に従って変換されます。すなわち、抽出データ の
          先 頭が ``0x'' または ``0X'' であれば 16 進変換、`0' で
          あれば 8 進変換、`1' から `9' までのどれかであれ ば  10
          進 変換が行われます。デフォルトではどのビットもセットさ
          れません。「定義済みマニピュレータ」の項に示すよう に、
          マニピュレータ dec、oct、hex を用いて基数を設定すること
          もできます。

     showbase
          このフラグがセットされていると、変換後の整数値 は、 C++
          に おける整定数を表現するための書式で挿入されます。すな
          わち、8 進値の先頭には `0' が、16 進値の先頭には ``0x''
          ま たは ``0X'' (下の uppercase 参照) が付加されます。こ
          のフラグはデフォルトではセットされません。

     showpos
          このフラグがセットされていると、変換後の正の 10 進値  (
          浮 動 小 数点を含む) を挿入するとき、その前にプラス符号
          (+) が付けられます。このフラグはデフォルトではセット さ
          れません。

     uppercase
          このフラグがセットされていると、 showbase がセットさ れ
          ていれば、変換後の 16 進値の挿入時に大文字の `X' が使用
          されます。また、浮動小数点の変換時、指数表現に大文字 の
          `E'  が使用されます。このフラグがセットされていないと、
          小文字の `x' と `e' がそれぞれ使用されます。このフラ グ
          はデフォルトではセットされません。

     fixed
     scientific
          浮動小数点数の値を挿入するときの表記法を設定します。 静
          的メンバー ios::floatfield を使用すれば、2 つのフラグを
          まとめて操作することができます。一般に、変換の規則は  C
          の 標準入出力関数 printf ( printf(3) 参照) と同じです。
          scientific がセットされていると、`e' 表記 (指数表記) が
          使用されます。 fixed がセットされていると、`f' 表記 (固
          定小数点表記) が使用されます。2 つのフラグがともに セッ
          ト さ れ て い な い場合は `g' 表記が使用されます (上の
          uppercase も参照)。 precision によって値が設定されて い
          れ ば、 printf のフィールド幅指定としてその値が使用され
          ます。 precision によって値が設定されていれば、  printf
          の精度指定としてその値が使用されます。

     showpoint
          このフラグがセットされていると、浮動小数点の変換時に 数
          値 の最後のゼロ、または最後の小数点が残されます。デフォ
          ルトでは、数値の最後のゼロ、または最後の小数点は省略 さ
          れます。

     unitbuf
          出力ストリームをバッファリングする場合、バッファはそ れ
          が いっ ぱ いになるか、明示的なフラッシュ操作があるとフ
          ラッシュされます。この結果、出力が遅れたり、プログラ ム
          が ク ラッ シュした場合には出力が失われる可能性がありま
          す。ストリームをバッファリングしないで、出力の遅延や 損
          失 をなくすこともできます。しかし、そのためには、文字出
          力のたびにシステムコールをしなければなりません。  unit-
          buf  がセットされていると、1 単位のデータの挿入が終わる
          たびにバッファをフラッシュする「単位バッファリング」 が
          行 われます。その結果、バッファリングなしの出力よりも低
          い負荷で頻繁に出力が行われます。プログラムの ソー ス で
          flush  を 何 度も呼び出す必要はありません。特に単位バッ
          ファリングは、コード内の特定の場所で他のソースコード を
          変更することなくオン / オフすることができます。デフォル
          トでは、このフラグはセットされません。

     stdio
          このフラグがセットされていると、ストリームに挿入が行 わ
          れるたびに C の標準入出力ファイル stdout と stderr がフ
          ラッシュされます。これは、C の標準入出力と入出 力 ス ト
          リー ムを同時に使用する場合に利用できます。デフォルトで
          は、このフラグはセットされません。

     書式制御関数には、次のものがあります。

     long theflags = s.flags()
          ストリーム s の現在の書式化フラグを long 型の値として返
          します。

     long oldflags = s.flags(newflags)
          newflags の long 値を用いて、ストリーム s のすべての 書
          式 化 フラグを置き換えます。変更前の書式化フラグを long
          型の値として返します。

     long oldflags = s.setf(newflags)
          ストリーム s の書式化フラ グ の う ち、  long  型 の 値
          newflags でセットされているビットに対応するものをセット
          します。それ以外のビットは変更しません。変更前の書式 化
          フラグを long 型の値として返します。関数 flags はすべて
          のフラグビットを置き換え、 setf は指定されたビットだ け
          を セットするという点に注意してください。グループに属さ
          ないフラグをセットする場合、 setf をこの形式で使用す る
          の が最も便利です。グループに属するフラグをセットする場
          合は、次に示すこの関数の 2 番目の形式を使用します。

     long oldflags = s.setf(newflags, field)
          long 型の値 field でセットされているビットにより示さ れ
          る 書式化フラグを long 型の値 newflags 内の対応するビッ
          トに置き換えます。指定されたフラグの変更前の値を返し ま
          す。  field  の 値として、通常は定数 basefield、adjust-
          field、floatfield のいずれかが使用されます。たとえ ば、
          左 寄 せ に設定して値を出力した後、調整を元に戻すために
          は、次のようにします。
               long oldadjust = cout.setf(ios::left, ios::adjustfield);
               cout << data;
               cout.setf(oldadjust, ios::adjustfield);
          この方法により、 adjustfield ビットの中の特定の 1 つ の
          ビッ トだけを確実にセットします。また、以前の状態に容易
          に戻すことができます。フィールドの新しい値としてゼロ を
          使 用すると、それらのフラグだけがクリアされます。たとえ
          ば、整数変換時の基数をデフォルト状態に戻すには、次の よ
          うにします。
               cout.setf(0, ios::basefield);
          manip(3CC4)に あ る マ ニ ピュ レー タ  setiosflags  と
          resetiosflags の説明も参照してください。

     long oldflags = s.unsetf(newflags)
          ストリーム s の書式化フラ グ の う ち、  long  型 の 値
          newflags でセットされているビットに対応するものをクリア
          します。残りの書式化フラグは変更しません。変更前の書 式
          化 フ ラ グを long 型の値として返します。対応するフラグ
          ビットを、関数 setf はセットし、 unsetf はクリアする と
          い う 点に注意してください。 manip(3CC4) にあるマニピュ
          レータ resetiosflags の説明も参照してください。

     char thefill = s.fill()
          ストリーム s の現在のパディング文字を返します。パディン
          グ 文字は、指定されたフィールド幅に合わせてデータを挿入
          するときに必要に応じて使用されます。このリリースで は、
          fill  に 対 し て複数バイト文字は使用できません。前述の
          left、right、internal も参照してください。

     char oldfill = s.fill(newfill)
          ストリーム s のパディング文字を newfill に設定し、設 定
          前 のパディング文字を返します。デフォルトのパディング文
          字は空白です。 manip(3CC4) にある setfill の説明も参 照
          してください。

     int theprec = s.precision()
          ストリーム s の書式状態 ``precision'' の現在の値を返 し
          ま す。この値は、浮動小数点数の挿入時に変換する小数部の
          有効桁数を表します。前述の scientificおよびfixed を参照
          してください。

     int oldprec = s.precision(newprec)
          ストリーム s の書式状態 ``precision'' (小数部の有効桁数
          ) を newprec に設定し、設定前の値を返します。デフォルト
          値は 6 です。 manip(3CC4) にあるマニピュレータ  setpre-
          cision の説明も参照してください。

     int thewidth = s.width()
          ストリーム s の書式状態 ``field width'' (フィールド幅 )
          の 現在の値を返します。フィールド幅がゼロのとき、挿入演
          算では、該当する値を表すのに必要な文字だけが書き込ま れ
          ま す。フィールド幅の文字数が必要な文字の数よりも多い場
          合は、指定された幅に合わせてパディング文字が挿入され ま
          す。 フィールド幅の文字数が必要な文字の数よりも少ない場
          合は、フィールドは必要なだけ拡大されます。このフィー ル
          ド 幅は最小のフィールド幅を表します。最大のフィールド幅
          として使用し、挿入する値を丸めることはできません。ワ イ
          ド文字出力の幅は、バイト数ではなく文字数で表現します。

     int oldwidth = s.width(newwidth)
          ストリーム s の書式状態 ``field width'' (フィールド幅 )
          を  newwidth に設定し、設定前の値を返します。デフォルト
          値は 0 です。書式つきの挿入または抽出が行われるたびに、
          フィー ル ド 幅は自動的にゼロに再設定されます。したがっ
          て、フィールド幅が必要な操作を行うたびに設定を行う必 要
          があります。 manip(3CC4) にあるマニピュレータ setw の説
          明も参照してください。

  ユーザー定義の書式フラグ
     派生クラスで独自の書式フラグと変数が必要な場合のために、ユー
     ザー 定 義の書式フラグと変数が用意されています。あるクラスに
     いったん割り当てられると、フラグと変数はそのプログラムが終了
     するまで確保されます。複数のクラスで同じフラグや変数を割り当
     てても、それらが衝突することはありません。

     long thebit = ios::bitalloc()
          静的メンバー関数。まだ割り当てられていないフラグビッ ト
          を 1 つセットした long 型の値を返します。この値は、たと
          えば setf の呼び出しの中で、クラス固有の目的のための フ
          ラ グ と し て使用できます。割り当てには、少なくとも 16
          ビットを使用できます。使用できるビットがない場合、こ の
          関数はゼロを返します。

     int index = ios::xalloc()
          静的メンバー関数。「ワード」の配列の未使用のインデッ ク
          ス を返します。1 つのワードは、 long 型の値または void*
          型の値を格納するのに十分なサイズを持っています。取得 し
          たインデックスを関数 iword または ipword で使用すれば、
          確保されているステータス変数への参照を取得できます。

     long theword = s.iword(i)
     void* theptr = s.ipword(i)
          i が ios::xalloc の呼び出しによって返されたインデックス
          値のとき、これらの関数は、クラス s のためのユーザー定義
          ステータス変数 (ワード) の i 番目の要素を返します。関数
          iword  は、  long 型の参照を返します。また、関数 ipword
          は、 void* 型の参照を返します。返される参照がいつまでも
          一 定 で あるとは限りません。特に、 xalloc() を呼び出す
          と、以前の参照が無効になる場合があります。

  その他の関数
     streambuf* sbp = s.rdbuf()
          ストリームに対応する streambuf を指すポインタを返 し ま
          す。 これは、ストリームの作成の一部であり、バッファクラ
          スのオブジェクトは通常変更されません。この関数によ り、
          ストリーム・オブジェクトが与えられた streambuf 関数に直
          接アクセスすることができます。

     ostream* oldosp = s.tie(osp)
          ストリームは、ストリーム変数 ``tie'' によってポイントさ
          れ る  1  つの ostream に結合されることがあります。スト
          リームにさらに入力を行なったり、その出力をフラッシュ し
          た りする必要があるとき、結合されているストリームがあれ
          ば、まずそのストリームをフラッシュしなければな り ま せ
          ん。 た と え ば、新しく入力を試みる場合、最初に cin を
          cout に結合することで、プロンプトのような保留された出力
          を フラッシュする必要があります。この関数は、ストリーム
          s の変数 tie を入力パラメタ osp が指す ostream に 設 定
          し、変数 tie の設定前の値を返します。次のシーケンスは、
          何らかの作業が行われている間にストリームの結合 を 解 除
          し、以前の結合状態に戻します。

               ostream* oldosp = s.tie(0);
               ...  ...
               s.tie(oldosp);

     ostream* theosp = s.tie()
          変数 ``tie'' の現在値を返します (上記参照)。

     ios::sync_with_stdio()
          C の標準入出力操作と C++ のストリーム操作を同じ標準ファ
          イ ルで実行すると、同期の問題が発生します。入出力の各ス
          タイルではそれぞれ独自のバッファリングが行われるた め、
          プ ログラムの実行順序と入出力の順序は異なります。この同
          期の問題を解決するため、標準ストリー ム で あ る  cin、
          cout、  cerr、clog のいずれかに入出力を行う場合は、その
          前にこの静的関数を必ず呼び出してください。この関数 は、
          各 標準ストリームを stdiobuf を使用するように再設定しま
          す。これにより、標準入出力とストリームを介して行う入 出
          力 が同期して行われます。パフォーマンスは、バッファつき
          ストリーム入出力やバッファつき標準入出力をそれぞれ単 独
          で 行 なった場合よりもかなり低下します。 stdiobuf(3CC4)
          を参照してください。
          注 : sync_with_stdio が必要になるのは、同じ標準入力ファ
          イ ル、出力ファイル、エラーファイルに入出力を行うときだ
          けです。 stdin 上で C の標準 (stdio) 入力関数を排他的に
          使 用し、 cout 上でストリーム出力関数を排他的に使用する
          ことは、難しくはありません。

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

     s >> dec
     s << dec
          ストリーム s の変換基数を 10 に設定します。

     s >> oct
     s << oct
          ストリーム s の変換基数を 8 に設定します。

     s >> hex
     s << hex
          ストリーム s の変換基数を 16 に設定します。

     s >> ws
          ストリーム s から空白 類 を 抽 出 し、 破 棄 し ま す。
          istream(3CC4) を参照。

     s << endl
          ストリーム s に改行を挿入した後、そのストリームをフラッ
          シュします。 ostream(3CC4) を参照。

     s << ends
          ストリーム s に NULL 文字 (`\ 0') を挿入して文字列を 終
          了します。 strstream(3CC4) を参照。

     s << flush
          ストリーム s をフラッシュします。  ostream(3CC4)  を 参
          照。


     <manip.h> を取り込むと、上記以外のマニピュレータも利用できる
     ようになります。 manip(3CC4) を参照してください。


関連項目

     ios.intro(3CC4)、 filebuf(3CC4)、 fstream(3CC4)、
     istream(3CC4)、 manip(3CC4)、 ostream(3CC4)、 printf(1)
     printf(3S), printf(3B), sbuf.prot(3CC4)、 sbuf.pub(3CC4)、
     ssbuf(3CC4)、 stdiobuf(3CC4)、 strstream(3CC4)、
     stream_locker(3CC4)、 stream_MT(3CC4)、『C++ ライブラリ・リ
     ファレンス』の第 3 章「iostream ライブラリ」および第 4 章
     「マルチスレッド環境での従来型の iostream ライブラリの使用」