IOS(3CC4)

名前
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
    出力ストリームをバッファリングする場合、 バッファはそれがいっぱいになるか、明示的なフラッシュ操作があると フラッシュされます。 この結果、出力が遅れたり、 プログラムがクラッシュした場合には出力が失われる可能性があります。 ストリームをバッファリングしないで、出力の遅延や損失をなくすこともできます。 しかし、そのためには、文字出力のたびにシステムコールをしなければなりません。 unitbuf がセットされていると、 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、adjustfield、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) にあるマニピュレータ setprecision の説明も参照してください。

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(3C) sbuf.prot(3CC4)、 sbuf.pub(3CC4)、 ssbuf(3CC4)、 stdiobuf(3CC4)、 strstream(3CC4)、 stream_locker(3CC4)、 stream_MT(3CC4)、 『C++ ライブラリ・リファレンス』の第 3 章「iostream ライブラリ」 および第 4 章「マルチスレッド環境での従来型の iostream ライブラリの使用」