この関数の目的
fseek()は、ファイルの読み書き位置を移動する。
定義
#include <stdio.h> int fseek(FILE *stream, long int offset, int whence);
働き
この関数は、 stream で指定されるストリームのファイル位置の指定子をセットする。
バイナリストリームでは、ファイルの先頭からの文字数で決められる場所は whence で決まる位置に offset の数値を足すことで指定することができる。 whence に SEEK_SET を使えば、ファイルの先頭に offset を足すことになる。 同様に、 SEEK_CUR は現在のファイル位置指定子に、 SEEK_END はファイルの最後に足すことになる。 バイナリストリームは意味ありげに whence に SEEK_END を使った fseek をサポートする必要はない。
テキストストリームでは、 offset は 0 か以前に同じストリームに対して行われた ftell() の返り値であるかであり、 whence は SEEK_SET である。
fseek() が成功すれば、ストリームの「ファイルの終り」指定子が解除され、 ungetc() のいかなる効力も無に帰する。更新モードのストリームなら、 fseek() の後は入力でも出力でも行われてよい。
返り値は、要求が満たされない場合にのみゼロでない。
解説
この関数を使えば、ファイル内の好きなところへ自由に飛ぶことができるのだが、注意するべき点がいくつかある。 まず、テキストストリームに対して使うなら、 SEEK_CUR および SEEK_END は使えない。 その上、 offset には呼び出された ftell() の返り値しか使ってはいけない。 つまり一度通過した地点を覚えておいて、そこに戻るときにしか使えない。他の物と同じように、使えたとしてもそれはその処理系が親切なだけである。 要するに、この関数は主にバイナリファイルに対して使われるのである。似たような関数として、 fgetpos() と fsetpos() がある。
「whence」というのはあまり聞きなれない英語だが、「from where」つまり「どこから」を意味するものである。 プログラマは先頭、現在地、末尾の3つから選ぶことができる。それぞれ SEEK_SET 、 SEEK_CUR 、 SEEK_END に対応しているわけだ。
また、 SEEK_END を使ったときは offset の値は負にしなければならない。 これは offset が単に出発地点に足されるという説明からすれば自然なことである。
余談だが、「seek」というのは元々「探す」という意味の英語である。この言葉はコンピュータ業界用語では読み取り・書き込みする場所を順番をとばして遠くへ移すという意味になってしまった。 コンピュータの記憶媒体は順番に入れて順番に出す(「ストリーム==流れ」というのはこのイメージである)ものが多いので、seekができるということは大きな意味を持つ。 前者のような操作ができるとき、ランダムアクセスができるといい、後者のような場合をシーケンシャルアクセスという。