# マニュアルページ fstream.3

## 名前

         fstream - ファイル入出力用ストリームクラス

## 形式

         #include <fstream.h>
         typedef long streampos;
         typedef long streamoff;
         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 };

              // 残りの部分については 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 をファイルを使用した入出力用に特
         殊化したものです。すなわち、対応する streambuf は filebuf に
         なります。

         補助クラス fstreambase は実装上の詳細なことなので、ここで は
         取り上げません。これは主に共通の関数のセットを提供するための
         ものです。

         ここでは、 ifstream、ofstream、fstream の 3 つのクラスをまと
         めて説明します。 Xstream という表記は、この 3 つのクラスのそ
         れぞれに置き換えてください。

         fstream、 ifstream、 ofstream 型のオブジェクトは、mutex ロッ
         クを使用することで、複数のスレッドからの同時アクセスに対して
         保護されます。MT-safe (マルチスレッド環境で使用しても安 全 )
         で あ る 必 要 が な い 新しいクラスを派生する場合は、クラス
         unsafe_fstreambase を使用できます。クラス fstreambase は提供
         さ れている 3 つのファイルクラスの基底クラスで、mutex ロック
         を使用して複数のスレッドからの同時アクセスに対する保護を行い
         ます。

         他の入出力ストリームクラスと同様、クラス stream_MT で定義 さ
         れ ているメンバー関数 set_safe_flag を呼び出せば、mutex ロッ
         クを無効にすることができます。

      コンストラクタ
         Xstream()
              どのファイルにも接続されていないクローズした Xstream を
              作成します。

         Xstream(name, mode, prot)
              Xstream を作成し、ファイル name をオープンします。 ファ
              イルのオープン時には、オープンモード・ビットとして mode
              、ファイル保護ビットとして prot を使用します ( 後 述 の
              open  を参照)。デフォルトのオープンモードは ifstream の
              場合は入力、 ofstream の場合は出力になります。デフォ ル
              ト の保護モードは、 filebuf::openprot (0666) です。発生
              したエラーはすべて Xstream のエラー状態として格納されま
              す。詳細については ios(3CC4) を参照してください。

         Xstream(f)
              ファイル記述子 f にアタッチされた Xstream を作 成 し ま
              す。 f は、あらかじめオープンしていなければなりません (
              オープンしているかどうかのテストは行われません)。

         Xstream(f, ptr, len)
              ファイル記述子 f にアタッチされた Xstream を作 成 し ま
              す。 f は、あらかじめオープンしていなければなりません (
              オープンしているかどうかのテストは行 わ れ ま せ ん )。
              filebuf  は、 ptr が指す位置から始まる len 個の char を
              バッファ(予約領域) として使用します。 ptr がゼロ、ま た
              は len がゼロ以下のとき、バッファ領域は割り当てられず、
              fbuf でバッファリングは行われません。

      メンバー関数
         fs.attach(f)
              オープンしているファイル記述子 f に fs を接続し ま す。
              fs がすでにファイルに接続されている場合は要求を無視し、
              fs のエラー状態に ios::failbit をセットします。

         fs.close()
              対応する filebuf をクローズし、 fs からファイルを切り離
              し ます。 filebuf の close が正常終了した場合はエラー状
              態をクリアします。 close 呼び出しが正常終了しなかった場
              合は fs のエラー状態に ios::failbit をセットします。

         fs.open(name, mode, prot)
              ファイル name をオープンし、そのファイル記述子を fs  に
              接 続 し ま す。 ファ イ ル が 存 在 せず、かつ mode に
              ios::nocreate がセットされていない場合は、 prot で指 定
              された保護ビット (デフォルト値は 0666) でファイルを作成
              しようとします。 mode パラメタは ios::open_mode の以 下
              の ビットの集まりです。これらのビットの論理和をとること
              ができます。
              ios::app
                   最初にファイルの終端までシークします。それ以降ファ
                   イルに書き込まれるデータは、必ずファイルの終端に追
                   加されます。このフラグがセットされると、  ios::out
                   も自動的にセットされます。
              ios::ate
                   最初にファイルの終端までシークします。このフラグを
                   セットしても、 ios::out が自動的にセットされること
                   はありません。ファイルの終端から操作を開始するだけ
                   です。
              ios::in
                   ファイルを入力用にオープンします。入力用に開こうと
                   したファイルが存在しない場合、あらたに作成されるこ
                   とはありません。 ifstream を作成またはオープンする
                   と、 こ のビットが自動的にセットされます。したがっ
                   て、明示的にセットする必要はありませ ん。  fstream
                   でこのビットがセットされていると、可能であれば入力
                   操作が許可されます。 ofstream でこのビットをセット
                   すると、ファイルがオープンしていれば、そのファイル
                   の切り捨てが拒否されます。
              ios::out
                   ファイルを出力用にオープンします。 ofstream を作成
                   またはオープンすると、このビットが自動的にセットさ
                   れます。したがって、明示的にセットする必要はありま
                   せ ん。 fstream でこのビットがセットされていると、
                   可能であれば出力が許可されます。 ifstream で こ の
                   ビットをセットすることも可能ですが、ファイルへの出
                   力は許可されません。
              ios::trunc
                   ファイルがすでに存在する場合、そのファイルのオープ
                   ン時にゼロの長さに切り捨てます。 ios::out が明示的
                   または暗示的に指定され、かつ ios::ate と  ios::app
                   がどちらも指定されていない場合は、このビットが自動
                   的に指定されます。
              ios::nocreate
                   ファイルを作成する場合、そのファイルが既存のもので
                   あることが条件となります。ファイルが存在しない場合
                   は open が異常終了します。
              ios::noreplace
                   ファイルの作成時、そのファイルが存在していないこと
                   が条件となります。ファイルが存在する場合は open が
                   異常終了します。このビットは、ファイルを入力 用 に
                   オープンする場合にのみ意味を持ちます。

         filebuf* fb = fs.rdbuf()
              fs に対応する filebuf へのポインタを返します。戻り値 が
              filebuf  であること以外、この関数は基底クラスバージョン
              の関数と同じです。

         fs.setbuf(ptr, len)
              ptr が指す位置から始まる、 len 個の char で構成さ れ る
              バッ ファを予約領域として確保します。この関数は filebuf
              バージョンの setbuf を呼び出し、その戻り値に従っ て  fs
              の エ ラー 状態を修正します。具体的には、正常終了時はエ
              ラー状態をクリアし、エラー時は ios::failbit をセット し
              ます。

## 関連項目

         ios.intro(3CC4)、 filebuf(3CC4)、 ios(3CC4)、
         istream(3CC4)、 ostream(3CC4)、 sbufpub(3CC4)、『C++ ライブ
         ラリ・リファレンス』の第 3 章「iostream ライブラリ」および第
         4 章「マルチスレッド環境での従来型の iostream ライブラリの使
         用」