直接探査入出力、つまりランダム入出力を使用すると、レコード番号によってファイルに直接探査できます。レコード番号は、レコードが書き込まれたときに割り当てられます。順番入出力とは異なり、直接探査出力レコードは、どのような順番でも読み取り、あるいは書き込みできます。しかし、直接探査ファイルでは、すべてのレコードが同じ固定長でなければいけません。直接探査ファイルは、そのファイルの OPEN 文の ACCESS='DIRECT' 指定子によって宣言されます。
直接探査ファイル中の論理レコードは、OPEN 文の RECL= 指定子によって指定されたバイト長を持つ文字列です。 READ 文と WRITE 文で、定義されたレコードサイズより大きな論理レコードを指定してはいけません。レコードサイズはバイト数で指定します。論理レコードのほうが短い場合は差し支えありません。書式なし直接探査書き込みでは、レコード中の書き込まれていない部分は不定となります。書式付き直接探査書き込みでは、書き込まれていないレコードは空白で埋められます。
直接探査の READ 文と WRITE 文には、REC=n 引数が追加されており、読み取りや書き込みを行うレコード番号を指定するようになっています。
例: 直接探査、書式なし
OPEN( 2, FILE='data.db', ACCESS='DIRECT', RECL=200, & FORM='UNFORMATTED', ERR=90 ) READ( 2, REC=13, ERR=30 ) X, Y |
このプログラムでは、ファイルを直接探査、書式なし入出力、200 バイトの固定記レコードで開いたあとで、13 番目のレコードを X と Y に読み込みます。
例: 直接探査、書式付き
OPEN( 2, FILE='inven.db', ACCESS='DIRECT', RECL=200, & FORM='FORMATTED', ERR=90 ) READ( 2, FMT='(I10,F10.3)', REC=13, ERR=30 ) X, Y |
このプログラムでは、ファイルを直接探査、書式なし入出力、200 バイトの固定レコード長で開きます。次に 13 番目のレコードを読み取り、(I10,F10.3) の書式を使用して変換します。
書式付きファイルの場合、書き込まれるレコードのサイズは、FORMAT 文によって決定されます。前述の例では、FORMAT 文はレコードを 20 文字、または 20 バイトに定義しています。並び上のデータの量が FORMAT 文で指定されたレコード長より大きい場合、1 つの書式付き書き込みで複数のレコードを書き込むことができます。このような場合、各後続のレコードには、連続するレコード番号が割り当てられます。
例: 直接探査、書式付き、複数レコード書き込み:
OPEN( 21, ACCESS='DIRECT', RECL=200, FORM='FORMATTED') WRITE(21,'(10F10.3)',REC=11) (X(J),J=1,100) |
直接探査装置 21 への書き込みによって、10 の要素からなる 10 のレコードが作成されます。 なぜなら、レコードごとに 10 要素であると書式で指定しているからです。 これらのレコードには、11 から 20 までの番号が割り当てられます。