ファイル内の読み込み位置と書き込み位置を変更することができます。そのためには次のようなツールがあります。
tellg (tellp) は istream (ostream) のメンバー関数で、現在のファイル内の位置を返します。istream と ostream は fstream の親クラスですので、tellg と tellp も fstream クラスのメンバー関数として呼び出すことができます。
seekg (seekp) は istream (ostream) のメンバー関数で、指定したファイル内の位置を探し出します。
列挙型 seek_dir は、seek での相対位置を指定します。
enum seek_dir {beg=0, cur=1, end=2}; |
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 値が示す位置からの相対位置となります。次に例を示します。
aFile.seekp(-10, ios::end); |
この例では、ファイルの最後から 10 バイトの位置に設定されます。
aFile.seekp(10, ios::cur); |
一方、次の例では現在位置から 10 バイト進められます。
テキストストリーム上での任意位置へのシーク動作はマシン依存になります。 ただし、以前に保存した streampos の値にいつでも戻ることができます。