Fortranで、普通の
WRITE(*,*) "HELLO WORLD!"で書かれるファイルが「書式付き順番探査ファイル (formatted sequential access file)」(以下「通常の」ファイル) ですが、 別の種類のファイルとして
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 作成)