#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_istream : virtual public unsafe_ios { public: // エクスポートされた関数 // 書式なし入力関数 unsafe_istream& read(char* ptr, int count); unsafe_istream& read(unsigned char* ptr, int count); unsafe_istream& get(char* ptr, int count, char delim='\n'); unsafe_istream& get(streambuf& sbuf, char delim='\n'); unsafe_istream& get(char& ch); unsafe_istream& get(unsigned char& ch); unsafe_istream& get_line (char *ptr, int count, char delim='\n'); unsafe_istream& get_line (unsigned char *ptr, int count, char delim='\n'); int get(); int peek(); unsafe_istream& ignore(int count=1, int delim=EOF); unsafe_istream& putback(char ch);
// ワイド文字 unsafe_istream& get(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); unsafe_istream& get(wchar_t& wc); unsafe_istream& getline(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); unsafe_istream& wignore(count=1, wdelim=WEOF); // その他の関数 int ipfx(int noform=0); int wipfx(int noform=0); // ワイド文字 ipfx unsafe_istream& seekg(streampos pos); unsafe_istream& seekg(streamoff offset, unsafe_ios::seek_dir dir); streampos tellg(); int sync(); int gcount(); public: // エクスポートされた演算子関数 unsafe_istream& operator>> (char* buf); unsafe_istream& operator>> (unsigned char* buf); unsafe_istream& operator>> (char&); unsafe_istream& operator>> (unsigned char&); unsafe_istream& operator>> (short&); unsafe_istream& operator>> (int&); unsafe_istream& operator>> (long&); unsafe_istream& operator>> (unsigned short&); unsafe_istream& operator>> (unsigned int&); unsafe_istream& operator>> (unsigned long&); unsafe_istream& operator>> (float&); unsafe_istream& operator>> (double&); unsafe_istream& operator>> (streambuf* sbufp); unsafe_istream& operator>> (unsafe_istream& (*manip)(unsafe_istream&)); unsafe_istream& operator>> (unsafe_ios& (*manip)(unsafe_ios&) ); public: // ワイド文字 unsafe_istream& operator>>(wchar_t&); unsafe_istream& operator>>(wchar_t*); public: // エクスポートされたコンストラクタ unsafe_istream(streambuf* sbuf); }; class istream : virtual public ios, public unsafe_istream { public: //エクスポートされた関数
// 書式なし入力関数 istream& read(char* ptr, int count); istream& read(unsigned char* ptr, int count); istream& get(char* ptr, int count, char delim='\n'); istream& get(unsigned char* ptr,int count, char delim='\n'); istream& get(unsigned char& ch); istream& get(char& ch); istream& get(streambuf& sb, char delim ='\n'); istream& getline(char* ptr, int count, char delim='\n'); istream& getline(unsigned char* ptr, int count, char delim='\n'); int get(); int peek(); istream& ignore(int len=1,int delim=EOF); istream& putback(char ch);
// ワイド文字 istream& get(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); istream& get(wchar_t& wc); istream& getline(wchar_t* wptr, int count, wchar_t wdelim=L'\n'); istream& wignore(int count=1, wchar_t wdelim=WEOF); wint_t peekw();
// その他の関数 int ipfx(int noform=0); istream& seekg(streampos pos); istream& seekg(streamoff offset, seek_dir dir); streampos tellg(); int sync(); int gcount(); public: // エクスポートされた演算子関数 istream& operator>>(char*); istream& operator>>(unsigned char*); istream& operator>>(char&); istream& operator>>(unsigned char&); istream& operator>>(short&); istream& operator>>(int&); istream& operator>>(long&); istream& operator>>(unsigned short&); istream& operator>>(unsigned int&); istream& operator>>(unsigned long&); istream& operator>>(float&); istream& operator>>(double&); istream& operator>>(streambuf*); istream& operator>>(istream& (*)(istream&)); istream& operator>>(ios& (*)(ios&)); public: // ワイド文字 istream& operator>>(wchar_t&); istream& operator>>(wchar_t*); public: // エクスポートされたコンストラクタ istream(streambuf*);
};
class istream_withassign : public istream { public: istream_withassign(); istream_withassign& operator= (istream&); istream_withassign& operator= (streambuf*); }; extern istream_withassign cin; ios& dec(ios&); ios& hex(ios&); ios& oct(ios&); istream& ws(istream&);
unsafe_ios& dec(unsafe_ios&) ; unsafe_ios& hex(unsafe_ios&) ; unsafe_ios& oct(unsafe_ios&) ; unsafe_istream& ws(unsafe_istream&) ;
クラス istream は関連付けられている streambuf からのデータの書式付きおよび書式なしの抽出 (入力) をサポートします。
istream オブジェクトとそのメンバー関数は、相互排他ロックにより複数のスレッドの同時アクセスに対して保護されます。unsafe_istream オブジェクトとそのメンバー関数は相互排他ロックを実装しません。この違いを除き、istream と unsafe_istream、およびそれぞれのメンバー関数の機能は同じです。MT-安全、相互排他ロック、およびこれらと iostreams オブジェクトとの関係については、MT-安全 libC のプログラマーズガイドを参照してください。
.
sbufp が指す streambuf をストリームに関連付け、ios 状態を初期化します。
初期化を実行しません。
sbufp が指す streambuf を isw に関連付け、isw を完全に初期化します。
istr に関連付けられた streambuf を isw に関連付け、コンストラクタは isw を完全に初期化します。
ワイド文字を生成する入力関数は、不正なバイトのシーケンスを検出すると failbit を設定します。バイトのシーケンスは、入力関数が現在のロケールでそれを文字の複数バイトエンコーディングと解釈できない場合に、不正と見なされます。
先読みするような複数バイトの入力操作の直後に、単一バイトの入力操作を行わないでください。単一バイト入力操作は、シーク (seekg) 後に許可されます。streambufs では 1 バイトの先読みのみをサポートする必要があるため、先読みする複数バイト入力操作は、istream 自体に「先読みした」バイトをバッファリングすることがあります。seekg と tellg では、そのような内部バッファリングを考慮します。
すべての抽出操作に共通の設定を実行します。書式付きの抽出では ipfx(0) を呼び出し、書式なしの抽出では ipfx(1) を呼び出します。istr のエラー状態がゼロ以外の場合、ipfx はただちにゼロを返します。ストリームが istr に結合され (ios3cc4() の tie を参照)、noform がゼロの場合、結合されているストリームはフラッシュされます。ストリームに skipws フラグが設定され、noform がゼロの場合、先頭の空白文字 (iswhite で定義されている、ctype(3c) を参照) はスキップされます。関数 ipfx は、何らかのエラー状況が検出された場合はゼロ、それ以外の場合はゼロ以外を返します。
ワイド文字エクストラクタは、ipfx の代わりに wipfx を使用します。これは ipfx() と似ていますが、ipfx が単一バイトのスペース文字をスキップする場合に、wipfx() は iswspace で定義されたすべての複数バイトのスペースをスキップします。さらに、wipfx() は不正なバイトのシーケンスを検出すると ios::failbit を設定します。この関数は、提案された ANSI iostreams インタフェースにないため、アプリケーションコードから直接呼び出すことは避けてください。
これらは ipfx(0) を呼び出します。ゼロを返す場合は、それ以上のアクションを行いません。それ以外の場合、ios::skipws が設定されていれば、先頭の空白が削除されます。istream 内に空白しか残っていない場合、文字はまったく残されず、ios::failbit が設定されます。ワイド文字書式付き入力関数は wipfx(0) を呼び出し、それがゼロを返す場合に何もアクションをとらずに戻ります。
istr から文字を抽出し、それらを sbufp が指す streambuf に挿入します。この関数は常に istr への参照を返します。この関数を使用して、ストリームを効率的にコピーできますが、どちらのストリームも結合されていないことを確認してください。例:
#include <iostream.h> main() { // copy cin to cout cin.tie(0); cout.tie(0); cin >> cout.rdbuf(); // see ios(3CC4) for rdbuf return 0; }
istr から文字を抽出し、x の型に従ってそれらを変換します。ipfx がゼロを返す場合、文字は抽出されず、x は変更されません。検出されたエラーはすべて istr のエラー状態で記録されます。一般に、ios::failbit は、次に使用可能な文字が型に適していなかったということを意味します。たとえば、数値型に対する先頭の文字や任意の型に対する先頭の空白などです。不正な文字は抽出されません。一般に、ios::badbit は抽出できる文字がなかったことを意味します。たとえば、ファイルの終端を越えて抽出を試みた場合などです。これらの関数は常に istr への参照を返します。ユーザー作成の関数は次の書式にし、
istream& operator>> (istream&, SomeType)
また、これらの原則に従ってください。
x の型と istream の書式状態 ( ios (3cc4) を参照) により、抽出と変換の詳細が決まります。これらの関数は istream の状態を変更しませんが、width 変数は書式付きの抽出後にゼロにリセットされます。定義済みの書式付きエクストラクタは次のとおりです。
1 文字抽出し、それを x に格納します。
wipfx(0) が成功し、ファイルの終端を検出していない場合、1 つの複数バイト文字を抽出し、それをワイド文字として x に格納します。不正なバイトのシーケンスを検出した場合は ios::failbit を設定します。
文字を抽出し、istream の書式フラグの変換基数に従って、それらを整数値に変換し、x に値を格納します。先頭の文字はプラス符号 (+) またはマイナス符号 (-) の場合があります。すると、ios::basfield フラグが dec、oct、または hex の場合、文字はそれぞれ 10 進数、8 進数、16 進数として扱われます。これらのどのフラグも設定されていない場合、数字は C++ の整数定数と同様に解釈されます。つまり、先頭の 2 文字が「0x」または「0X」場合、基数は 16 進数、それ以外の場合で先頭の文字が「0」の場合、基数は 8 進数、それ以外の場合、基数は 10 進数になります。抽出 (と変換) は最初の数字以外で停止し、それは抽出されません。有効な数字は 8 進数の場合は 0 - 7、10 進数の場合は 0 - 9、16 進数の場合は 0 - 9、a - f、A - F です。有効な数字が検出されない場合、エラーフラグ ios::failbit が設定されます。「0x」の後に数字以外が続いているとエラーです。エラーの場合、x の値は変更されません。
文字を抽出し、浮動小数点定数の C++ の規則に従って、それらを浮動小数点数値に変換し、値を x に格納します。抽出された文字が正しい形式の浮動小数点数で始まっていない場合、エラーフラグ ios::failbit が設定されます。この場合でも、エラーが検出された場所によっては、一部の文字が抽出されることがあります。エラーの場合、x の値は変更されません。
空白文字が検出されるまで文字を抽出し、それらを x が指す配列に格納します。空白は抽出されません (ただし、ipfx は先頭の空白を破棄していることがあります)。width 書式設定変数 ( ios (3cc4) を参照) がゼロ以外の場合、最大で width-1 文字が抽出されます。何も抽出されない場合でも、終端の NULL (0) は常に x に格納されます。抽出できる文字がない場合、エラーフラグ ios::failbit が設定されます。
char* のエクストラクタと同じように動作しますが、複数バイト空白文字を検出するまで、複数バイト表現の文字をワイド文字の配列にデコードします。さらに、不正なバイトのシーケンスを検出した場合は ios::failbit を設定します。
これらは ipfx(1) を呼び出します。ゼロを返す場合は、それ以上のアクションを行いません。先頭の空白はスキップされず、変換も行われません。ワイド文字入力関数は、ipfx(1) の代わりに wipfx(1) を呼び出します。
istr から次の文字を抽出し、それを返します。それ以上文字がない場合は EOF を返します。ios::failbit は設定しません。
istr から次の文字を抽出し、それらを ch に格納します。それ以上使用可能な文字がない場合は、EOF を格納します。EOF を越えて抽出が試みられた場合は ios::failbit を設定します。この関数は常に istr への参照を返します。
istr から文字を抽出し、それらを ptr から始まる char 配列に格納します。count-1 文字が抽出されるか、delim に一致する文字が検出されるか、いずれかが最初に発生したときに、抽出が停止します。delim 文字が検出された場合、それは抽出または格納されません。この関数は、何も抽出されない場合でも、常に終端の NULL (0) を格納します。文字を格納する前に EOF が検出された場合のみ、ios::failbit を設定します。この関数は常に istr への参照を返します。
istr から文字を抽出し、それらを streambuf sbuf に格納します。delim (または EOF) に一致する文字を検出するか、sbuf への格納に失敗するか、いずれかが最初に発生したときに抽出が停止します。delim 文字が検出された場合、それは抽出または格納されません。delim が EOF の場合、入力をすべて処理したか、格納に失敗した場合にのみ、抽出が停止します。この関数は、sbuf への格納が失敗した場合にのみ ios::failbit を設定します。これは常に istr への参照を返します。
istr から次の文字を抽出し、それをそのワイド文字表現で wc に格納します。それ以上文字がない場合は WEOF を格納します。ファイルの終端を越えて抽出を試みた場合、または不正なバイトのシーケンスを検出した場合は ios::failbit を設定します。istr への参照を返します。
単一バイト文字の場合と同じですが、wptr は wchar_t の配列を指し、wdelim の型は wchar_t です。不正なバイトのシーケンスを検出した場合は ios::failbit を設定します。istr への参照を返します。
この関数は、istr.get(ptr, count, delim) と同じことを実行します。ただし、delim が検出された場合、それは抽出されますが、格納されません。count-1 文字が抽出されると、次の文字は delim である場合でも、istr に残されます。この関数は常に istr への参照を返します。
単一バイト文字の場合は、wptr は wchar_t の配列を指し、wdelim の型は wchar_t です。不正なバイトのシーケンスを検出した場合は ios::failbit を設定します。istr への参照を返します。
istr から文字を抽出してそれらを破棄します。delim に一致する文字が検出されるか、count 文字が検出されたか、EOF が検出されるか、いずれかが最初に発生したときに、抽出が停止します。delim 文字が抽出されます。delim が EOF である場合、入力はすべて破棄されます。この関数は常に istr への参照を返します。
ignore() の場合、wdelim が WEOF でなければ、count はスキップするバイト数ではなく、スキップする複数バイト文字数を示します。wdelim が WEOF の場合でも、不正なバイトのシーケンスを検出した場合 ios::failbit を設定して停止します。istr への参照を返します。
istr から文字を抽出し、それらを ptr から始まる char 配列に格納します。count 文字が抽出されたか、EOF が検出されるか、どちらかが最初に発生したときに抽出が停止します。count 文字が抽出される前に EOF が検出された場合、この関数は ios::failbit を設定します。これは常に istr への参照を返します。抽出された文字の数は、istr.gcount() を呼び出して見つけることができます。(下記を参照)。
これらは、istream に関連付けられた streambuf の get ポインタを処理します。詳細については、 sbufpub (3CC4) を参照してください。複数バイト入力操作によって、streambuf の get ポインタが tellg() で報告された値と異なることがありますが、istream 自体に対して実行されるシークは istream へのすべての操作と正しく同期します。
get ポインタの位置を設定し、istr を返します。
get ポインタの位置を設定し、istr を返します。
get ポインタの現在の位置を返します。複数バイト入力操作によって、streambuf の get ポインタが tellg() で報告された値と異なることがありますが、streambuf ではなく istream に対して実行されるシークは istream へのすべての操作と正しく同期します。
最後の書式なし入力関数によって istr から抽出された文字の数を返します。注: 書式付き入力関数が書式なし関数を呼び出すことがあるため、カウントが変化します。書式なしワイド文字入力関数の後に、gcount() は抽出した (複数バイト) 文字の数を返します。
まず istr.ipfx(1) を呼び出します。ipfx がゼロを返すか、istr が EOF にある場合、EOF を返します。それ以外の場合は次の文字を返します (抽出はしません)。
wipfx(1) を呼び出し、それが失敗した場合は (wint_t)WEOF を返します。不正なバイトのシーケンスを検出した場合は ios::failbit を設定し、WEOF を返します。成功した場合は stream の次の文字をワイド文字として返し、それを越えて移動しません。
istr.fail() がゼロ以外を返す場合、この関数は何もしないで戻ります。それ以外の場合、文字 ch をプッシュバックすることで、istr に関連付けられた streambuf のバックアップを試みます。抽出を行わないため、ipfx を呼び出しません。失敗することがあり、ios::failbit を設定します。一般に、c は streambuf の get ポインタの前の文字 (通常は最後に抽出された文字) に一致している必要があります。読み取り専用のメモリー内バッファーから入力されている場合があります。
内部データ構造と文字の外部ソース間の対応付けを実装で定義された方法で強制します。仮想関数 istr.rdbuf()->sync() を呼び出します。もちろん、これはバッファークラスの実際の型に依存します。エラー時に EOF を返します。
マニピュレータは、見掛け上、挿入または抽出されたオブジェクトとして使われることがありますが、多くはストリームの状態を変更するだけです。詳細については manip(3cc4) および ios(3cc4) を参照してください。istreams で使用するために、いくつかのマニピュレータが事前定義されています。
これは呼び出し manip(istr) と等価です。
istr の変換基数を 10 に設定します。
istr の変換基数を 8 に設定します。
istr の変換基数を 16 に設定します。
これは istr から連続した空白文字を抽出し、破棄します。
ctype (3C) , ios (3CC4) , ios.intro (3CC4) , manip (3CC4) , sbufpub (3CC4) , stdiobuf (3CC4)
『C++ ライブラリリファレンス』の第 3 章「従来型の iostream ライブラリ」および第 4 章「マルチスレッド環境での従来型の iostreams ライブラリの使用」