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