はじめての C

(続き)

ポジションの 変更

random access に 関する 最初の 関数が rewind() で、巻き戻す という 名前が 暗示するように、与えられた ポインタを 取り込み、その ファイルの 中の ポジションを リセットします。 ですので、次に 読み込み操作を するときには、そのデータは 最初の ところから 取り出します。

その シンタックスは 簡単です。

  rewind(pointer);

次の 2つの コマンド ftell() と fseek() は 関連しています。

前者は ファイルの 中の 現在の ポジションと 一致した long の 整数を 返します。 そして、後者により 他の 地点へと ジャンプさせることが できます。

これが 関数 ftell() の 構成に なります。

  long position = 0L;
FILE *pointer;
pointer = fopen("file", "r");
position = ftell(position);

覚えておかないと いけない 重要なことは、ftell が long の 整数を 返すと いうことです。 ですから、注意して 変数を 定義してください。

一度、ある ポジションを 保持すると、たぶん そのうち そこへ 戻りたくなります。 そして その方法が、次の 関数 fseek() による 構成です。

返り値の 整数が 0 なら、うまく いっています。 もし 0 以外の 値が 返ったときは その要求は 完了していません。

  int x;
x = fseek(pointer, position, SEEK_SET);

ファイルでの ポジションは 後の 2つの 引数 (パラメータ) によって 指定されていて、3つ目の パラメータを 使って、その offset を どこから 測定するかを 選びます。

SEEK_SET では、offset を ファイルの 先端に とり、SEEK_CUR では それを 現在の ポジションから 測定し、そして SEEK_END だと、offset は ファイルの 末尾に 特定します。

これら 3つの マクロが どこから 現れたのか、驚いたでしょうけど、すべて stdio.h に 定義されているのです。

ポジションを 20 byte 分、後ろに ずらすのなら、こう します。

  x = fseek(pointer, -20, SEEK_CUR);

ファイルの 末尾から 前へ 10 byte 分 ずらすのなら、こうです。

  x = fseek(pointer, -10, SEEK_END);

これらの 関数を 使えば、ファイルの 中の ポジションを 前や 後ろに 移動させる どんな 組合せでも 可能に なります。

そして、注意深く ファイルの 構成を 考えることで、データの 断片を いつでも 望むところへと 入れることが できるように なります。

先月、議論した ファイル書式の 更新と 組み合わせて 使うと、ハードウェアの ディスク容量が とても 制限されている - ハードディスクを もってない 人には 申し訳ない - ファイルでも 付け加えたり 編集することが できます。

さて、今のところ ファイルの 操作については これで 十分でしょう。 学習するための 一番の 方法は、いつものように、自分で やってみることです。

これらの 関数の manpage を 写してみます。

void rewind(FILE *stream);

rewind 関数は stream によって 指定された ストリームにおける、ファイル位置表示子 (file position indicator) の 先頭に セットする。

long ftell(FILE *stream);

ftell 関数は stream によって 指定された ストリームにおける、ファイル位置表示子の 現時点での 値を 与える。

int fseek(FILE * stream, long offset, int whence);

fseek 関数は stream によって 指定された ストリームにおいて ファイル位置表示子を セットする。

新たな位置 (バイト単位) は whence で 指定された 位置に offset バイトを 加えることによって 与えられる。

whence が SEEK_SET. SEEK_CUR, SEEK_END の どれかに なっている 場合は、それぞれ ファイルの 先頭、現在の 位置表示子、ファイルの 末尾 からの オフセットが 取られる。

(返り値) fseek は 成功すると 0 を 返す。

「ファイル書式の 更新と 組み合わせて」?? あとで、その page を 捜さないと ... oLr