関数
このトピックに関係が深い関数は次の二つである。
- int fseek( FILE *stream, long offset, int origin );
fseekの第2引数は第3引数(SEEK_SETなら先頭)からのオフセットである。
- long ftell( FILE *stream );
ftellの戻り値は先頭からのオフセットである。
「ftell 関数は stream に結合されているファイル ポインタ (ある場合) の現在の位置を得ます。この位置は、ストリームの先頭からのオフセットで表されます。」(Microsoft「Visual C++ ランタイムライブラリリファレンス」(アスキー)344p)
fseekでは具体的に指定する数値(第2引数)は、先頭バイト位置が1であろうと0であろうと、それとは無関係である。
ftellの戻り値も、先頭バイト位置が1であろうと0であろうと、それとは無関係である。
C++の関数リファレンスなどによれば、seekgには「入力ポインタ」という記述しかないが、seekpには「出力ポインタ」で「ファイルストリームではファイルの先頭からのバイトオフセット位置」という記述がある。seekpの場合はCの場合に近いことになる。
しかし、seekgの場合はファイルの絶対的なポインタの位置(バイト位置)で、seekpの場合はファイルの先頭からのバイトオフセット位置だというのは何かアンバランスなものを感じる。
- istreamクラス
istream& seekg(streampos pos);
istream& seekg(streamoff off,ios::seek_dir dir);
ストリームの入力ポインタを変更する。ファイルベースのストリームで使われる。
streampos tellg();
ストリームの入力ポインタの値を取り出す。
- ostreamクラス
ostream& seekp(streampos pos);
ostream& seekp(streamoff off,ios::seek_dir dir);
ストリームの出力ポインタを移動する。ファイルストリームではファイルの先頭からのバイトオフセット位置になる。
streampos tellp();
ストリームの出力ポインタの値(位置)を得る。ファイルストリームではファイルの先頭からのバイトオフセット位置になる。
これはMicrosoft「Visual C++ ランタイムライブラリリファレンス」(アスキー)による。streamposとstreamoffはlongと同義である(とtypedefされている)。