#include <fstream.h> typedef long streampos; typedef long streamoff; class unsafe_ios { public: // エクスポートされた型 // ストリームのステータスビット enum io_state { goodbit = 0x00, // ビットは設定されていない: すべて良好 eofbit = 0x01, // ファイルの終わりに位置している 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 };
// 残りについては ios(3CC4) を参照... }; class filebuf : public streambuf { // filebuf(3CC4) を参照... }; class unsafe_fstreambase : virtual public unsafe_ios { unsafe_fstreambase(); unsafe_fstreambase(const char*, int, int = filebuf::openprot); unsafe_fstreambase(int); unsafe_fstreambase(int _f, char*, int); ~unsafe_fstreambase();
void open(const char*, int, int = filebuf::openprot); void attach(int); void close(); void setbuf(char*, int); filebuf* rdbuf(); }; class fstreambase : virtual public ios, public unsafe_fstreambase { public: fstreambase() ;
fstreambase(const char*, int, int=filebuf::openprot) ; fstreambase(int) ; fstreambase(int, char*, int) ;
void open(const char*, int, int=filebuf::openprot) ; void attach(int); void close() ; void setbuf(char*, int) ; filebuf* rdbuf(); }; class ifstream : public fstreambase, public istream { public: // エクスポートされた関数 void open(const char* fname, int omode=ios::in, int prot=filebuf::openprot); filebuf* rdbuf(); public: // エクスポートされたコンストラクタ ifstream(); ifstream(const char* fname, int omode=ios::in, int prot=filebuf::openprot); ifstream(int fileno); ifstream(int fileno, char* buf, int size); }; class ofstream : public fstreambase, public ostream { public: // エクスポートされた関数 void open(const char* fname, int omode=ios::out, int prot=filebuf::openprot); filebuf* rdbuf(); public: // エクスポートされたコンストラクタ ofstream(); ofstream(const char* fname, int omode=ios::out, int prot=filebuf::openprot); ofstream(int fileno); ofstream(int fileno, char* buf, int size); }; class fstream : public fstreambase, public iostream { public: // エクスポートされた関数 void open(const char * fname, int omode, int prot=filebuf::openprot); filebuf* rdbuf(); public: // エクスポートされたコンストラクタ fstream(); fstream(const char* fname, int omode, int prot=filebuf::openprot); fstream(int fileno); fstream(int fileno, char* buf, int size); };
クラス ifstream、ofstream、および fstream はそれぞれ、クラス istream、ostream、および iostream をファイルを使用した I/O 用に特殊化したものです。そのため、関連付けられた streambuf は filebuf です。
補助クラス fstreambase は実装の詳細であり、主に共通の関数のセットを提供します。それについては詳しく説明しません。
これらのクラスをまとめて説明し、Xstream の表記を使用して、ifstream、ofstream、または fstream のどれも等しく表します。
型 fstream、ifstream、ofstream のオブジェクトは、相互排他ロックを使用することで、複数のスレッドによる同時アクセスに対して保護されます。MT-安全性を必要としない新しいファイルクラスを派生するには、クラス unsafe_fstreambase を使用できます。クラス fstreambase は提供されている 3 つのファイルクラスの基底クラスで、相互排他ロックを使用して MT-安全性を実現します。
ほかの iostream クラスの場合、相互排他ロックを無効にするには、クラス stream_MT で定義されているメンバー関数 set_safe_flag を呼び出します。
どのファイルにも接続されていないクローズした Xstream を構築します。
Xstream を構築し、オープンモードビットに mode、およびファイル保護ビットに prot を使用して、ファイル name をオープンします。(後述の open を参照)。デフォルトのオープンモードは ifstream の場合は入力、ofstream の場合は出力になります。デフォルトの保護は filebuf::openprot (0666) です。エラーは Xstream エラー状態で格納されます。ios(3CC4) を参照してください。
ファイル記述子 f (すでにオープンしている必要がある) にアタッチされた Xstream を構築します。(この条件はテストしません)。
ファイル記述子 f (すでにオープンしている必要がある) にアタッチされた Xstream を構築します。(この条件はテストしません)。filebuf は ptr が指す位置から始まる len char をバッファー (予約領域) として使用します。ptr がゼロ、または len がゼロ以下の場合、予約領域はなく、fbuf はバッファリングされません。
fs をオープンファイル記述子 f に接続します。fs がすでにファイルに接続されている場合は要求を無視し、ios::failbit を fs エラー状態に設定します。
関連付けられた filebuf をクローズし、fs からファイルを切断します。filebuf の close 呼び出しが成功した場合はエラー状態をクリアします。それ以外の場合は、ios::failbit を fs エラー状態に設定します。
ファイル name をオープンし、そのファイル記述子を fs に接続します。ファイルが存在せず、mode に ios::nocreate が設定されていない場合、open は prot で指定された保護ビット (デフォルト値は 0666) でファイルを作成しようと試みます。mode パラメータは、ともに論理和をとることができる ios::open_mode のビットの集まりです。
最初にファイルの終端までシークします。それ以降の書き込みは常にファイルの終端に追加されます。このフラグは ios::out を意味します。
最初にファイルの終端までシークします。このフラグは ios::out を暗黙的に示していませんが、ファイルの終端からのみ操作を開始します。
ファイルを入力のためにオープンします。入力のためにファイルを開き、そのファイルが存在しない場合、作成されません。ifstream の構築またはオープンでは常にこのビットを暗示するため、ビットを設定する必要がないことを意味します。fstream に設定した場合、入力は可能な場合に許可されることを意味します。ofstream に設定した場合、ファイルのオープン時に、ファイルが切り捨てられないことを意味します。
ファイルを出力のためにオープンします。ofstream の構築またはオープンでは常にこのビットを暗示するため、ビットを設定する必要がないことを意味します。fstream に設定した場合、出力は可能な場合に許可されることを意味します。ifstream に設定できますが、ファイルへの出力は許可されません。
ファイルが存在する場合、そのオープン時にゼロの長さに切り捨てます。ios::out が指定または暗黙的に指定され、ios::ate も ios::app もどちらも指定されていない場合は、このビットが暗黙的に指定されます。
ファイルがすでに存在していない場合は作成しないでください。この場合、open が失敗します。
ファイルはすでに存在していてはなりません。存在している場合、open が失敗します。このビットは、ファイルを出力用にオープンする場合にのみ意味を持ちます。
fs に関連付けられた filebuf へのポインタを返します。これはこの関数の基底クラスバージョンと同じですが、戻り型が具体的に filebuf になります。
これは ptr の位置に len char のバッファーを予約領域として提供します。これは filebuf バージョンの setbuf を呼び出し、その戻り値を使用して、fs のエラー状態を調整します。つまり、成功時はエラー状態をクリアし、エラー時は ios::failbit を設定します。
filebuf(3CC4), ios(3CC4), ios.intro(3CC4), istream(3CC4), ostream(3CC4), sbufpub(3CC4)
『C++ ライブラリリファレンス』の第 3 章「従来型の iostream ライブラリ」および第 4 章「マルチスレッド環境での従来型の iostreams ライブラリの使用」