(Fortran) 直接探査ファイルの使い方

Fortranで、普通の

      WRITE(*,*) "HELLO WORLD!"
で書かれるファイルが「書式付き順番探査ファイル (formatted sequential access file)」(以下「通常の」ファイル) ですが、 別の種類のファイルとして
  1. ファイルの途中の一部を読み書きできる
  2. 内部表現のまま読み書きされるので書式変換のオーバーヘッドがかからない (記憶容量・速度・精度の面で)
  3. ただし、すべての記録が同じ長さ
という特徴を持つ「書式なし直接探査ファイル (unformatted direct access file)」というのもあります。 順番探査がテープをイメージしているなら直接探査はディスクのイメージです。 良く使う機能で、使用も簡単ですが、 意外と「Fortran入門」的な本に載ってなかったりするので、 ここに使い方をまとめておきます。

      INQUIRE(IOLENGTH=L) A, B, M  ! 読み書きしたい記録の記録長を得る
      OPEN(11,FILE="FILE",ACCESS="DIRECT",RECL=L)
      WRITE(11,REC=100) A, B, L    ! 100番の記録に書き込む
      READ(11,REC=100) D(5:6), M   ! 100番の記録から読む

直接探査ファイルは、ある決まった記録長 (record length) の記録 (record) の集まりです。 記録長はOPEN文の「RECL=」指定子で指定します。 このときの単位は処理系定義です。 FORTRAN 77では記録長はユーザが計算する必要がありましたが、 Fortran 90以降では読み書きしたい記録の記録長を 処理系に計算させることができるようになりました。 上のINQUIRE文のように、記録長を格納する変数 (ここではL) と、 読み書きしたい記録 (ここでは実数2つと整数1つ) を指定すると記録長が求まります。

OPEN文では装置番号とファイル名の他に、 「ACCESS="DIRECT"」で直接探査ファイルを指定し、 「RECL=」で記録長を指定します。 直接探査ファイルは書式なしが既定です。 他にACTION=指定子等を指定してもいいでしょう。 「通常の」読み書きの場合に使うPOSITION=は使えません (必要ありません)。

READ/WRITE文では「通常の」読み書きで指定する書式のかわりに、 記録番号 (record number) を指定します。 最初の記録の記録番号は1です(0ではなく)。 どの記録番号の記録でも読み書きできます。 ただし、以前に書いていない記録は読めません (書いてない記録を読んだときの動作は未定義です)。 すべての記録が同じ長さで、入出力並び (input/output list) にはこれと ぴったり同じ長さに対応する式/変数を指定する必要があります。 上の例では実数型2つと整数型としているので、スカラ変数が3つとか、 大きさ2の配列と整数変数、などを指定しています。

だいたいこれくらいの説明で、後は想像力で便利に使えるかと思います。 なお、記録長も記録番号も、最大値には処理系ごとに (ディスクの容量以外にも) なにかしら限界があることを付け加えておきます。

(2005-03-10 作成)