FSTREAM(3CC4)

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