OSTREAM(3CC4)

名前
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 ライブラリの使用」