C++ ライブラリ・リファレンス

クラス fstream を使用したファイル操作

ファイル操作は標準入出力の操作に似ています。ifstreamofstreamfstream の 3 つのクラスはそれぞれ、istreamostreamiostream の各クラスから派生しています。この 3 つのクラスは派生クラスなので、挿入演算と抽出演算、および、その他のメンバー関数を継承しており、ファイル使用のためのメンバーとコンストラクタも持っています。

fstream のいずれかを使用するときは、fstream.h をインクルードしなければなりません。入力だけ行うときは ifstream、出力だけ行うときは ofstream、入出力を行うときは fstream を使用します。コンストラクタへの引数としてはファイル名を渡します。

thisFile というファイルから thatFile というファイルへのファイルコピーを行うときは、次のコーディング例のようになります。


ifstream fromFile("thisFile");
if    (!fromFile)
      error("unable to open 'thisFile' for input");
ofstream toFile ("thatFile");
if    ( !toFile )
      error("unable to open 'thatFile' for output");
char c ;
while (toFile && fromFile.get(c)) toFile.put(c);

このコードでは次のことを実行します。

オープンモード

オープンモードは、列挙型 open_mode の各ビットの OR をとって設定します。open_mode は、ios クラスの公開部で次のように定義されています。


enum open_mode {binary=0, in=1, out=2, ate=4, app=8, trunc=0x10,
	nocreate=0x20, noreplace=0x40}; 


注 -

UNIX では binary フラグは必要ありませんが、binary フラグを必要とするシステムとの互換性を保つために提供されています。移植可能なコードにするためには、バイナリファイルをオープンするときに binary フラグを使用する必要があります。


入出力両用のファイルをオープンすることができます。たとえば次のコードでは、 someName という入出力ファイルをオープンして、fstream 変数 inoutFile に結合します。


fstream inoutFile("someName", ios::in|ios::out);

ファイルを指定しない fstream の宣言

ファイルを指定せずに fstream の宣言だけを行い、後にファイルをオープンすることもできます。次の例では出力用の ofstream toFile を作成します。


ofstream toFile;
toFile.open(argv[1], ios::out);

ファイルのオープンとクローズ

fstream をいったんクローズし、また別のファイルでオープンすることができます。たとえば、コマンド行で与えられるファイルリストを処理するには次のようにします。


ifstream infile;
for (char** f = &argv[1]; *f; ++f) {
    infile.open(*f, ios::in);
    ...;
    infile.close();
}

ファイル記述子を使用したファイルのオープン

標準出力は整数 1 などのようにファイル記述子が分かっている場合は、次のようにファイルをオープンすることができます。


ofstream outfile;
outfile.attach(1);

fstream のコンストラクタにファイル名を指定してオープンしたり、open 関数を使用してオープンしたファイルは、fstream が破壊された時点 (delete するか、スコープ外に出る時点) で自動的にクローズされます。attach fstream に結合したファイルは、自動的にはクローズされません。

ファイル内の位置の再設定

ファイル内の読み込み位置と書き込み位置を変更することができます。そのためには次のようなツールがあります。

fstream aFile の位置再設定の例を次に示します。


streampos original = aFile.tellp();     //現在の位置の保存
aFile.seekp(0, ios::end);               //ファイルの最後に位置を再設定
aFile << x;                     //データをファイルに書き込む
aFile.seekp(original);                  //元の位置に戻る

seekg (seekp) は、1 つまたは 2 つの引数を受け取ります。引数を 2 つ受け取るときは、第 1 引数は、第 2 引数で指定した seek_dir 値が示す位置からの相対位置となります。次に例を示します。この例では、ファイルの最後から 10 バイトの位置に設定されます。


aFile.seekp(-10, ios::end);

一方、次の例では現在位置から 10 バイト進められます。


aFile.seekp(10, ios::cur);


注 -

テキストストリーム上での任意位置へのシーク動作はマシン依存になります。ただし、以前に保存した streampos の値にいつでも戻ることができます。