インテル® Fortran コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
このトピックは、Windows* にのみ適用されます。
Microsoft* Fortran PowerStation との互換性のために、fpscomp オプションを使用する際には、次の形式のファイルを使用できます。
書式付きシーケンシャル・ファイル
書式付き直接ファイル
書式なしシーケンシャル・ファイル
書式なし直接ファイル
バイナリー・シーケンシャル・ファイル
バイナリー直接ファイル
書式付きシーケンシャル・ファイルは、ファイル内の順序で、順に書き出され、また順に読み取られる一連の書式付きレコードです。レコードの長さはさまざまで、また空の場合もあります。次の図のように、レコードはキャリッジリターン (0D) 文字やラインフィード (0A) 文字で区切られます。
次に、書式付きシーケンシャル・ファイルに 3 つのレコードを書き出すプログラムの例を示します。また、下の図は結果として得られるファイルを示します。
OPEN (3, FILE='FSEQ')
! FSEQ はデフォルトで書式付きシーケンシャル・ファイル
WRITE (3, '(A, I3)') 'RECORD', 1
WRITE (3, '()')
WRITE (3, '(A11)') 'The 3rd One'
CLOSE (3)
END
書式付き直接ファイルでは、すべてのレコードは同じ長さで、任意の順序で読み取りや書き込みを行うことができます。レコードのサイズは、OPEN 文の RECL オプションで指定され、最も長いレコードのバイト数以上でなければなりません。
キャリッジリターン (CR) 文字およびラインフィード (LF) 文字は、レコードの分離記号で、RECL 値には含まれません。直接アクセスのレコードがいったん書き出されると、削除はできませんが、書き換えは可能です。
書式付き直接ファイルへの出力中に、レコードがデータで満たされなかった場合、コンパイラーはレコードの残りの部分に空白を挿入します。この空白の挿入により、ファイルにはすべて同じ長さの、完全に満たされたレコードだけが含まれることになります。また、入力時に、レコードに含まれるデータよりも多くのデータが入力リストと書式に必要な場合、コンパイラーはデフォルトで入力レコードに空白を挿入します。
ファイルの OPEN 文で PAD='NO' を設定すると、デフォルトの空白の挿入設定を上書きすることができます。PAD='NO' と設定されている場合、入力レコードには入力リストと書式の仕様で指定されているデータ量が含まれなければなりません。データ量が異なる場合には、エラーとなります。PAD='NO' の設定は、出力には影響しません。
次の例は、レコード 1 とレコード 3 の 2 つのレコードを書式付き直接ファイルに書き出すプログラム例です。また、下の図はその結果です。
OPEN (3,FILE='FDIR', FORM='FORMATTED', ACCESS='DIRECT',RECL=10)
WRITE (3, '(A10)', REC=1) 'RECORD ONE'
WRITE (3, '(I5)', REC=3) 30303
CLOSE (3)
END
書式なしシーケンシャル・ファイルは、プラットフォームにより、編成が少し異なります。このセクションでは、fpscomp オプションが指定された場合に、インテル® Fortran コンパイラーにより作成される書式なしシーケンシャル・ファイルについて説明します。
書式なしシーケンシャル・ファイル内のレコードは長さが異なります。書式なしシーケンシャル・ファイルは、130 バイト以下の物理ブロックと呼ばれる単位として編成されています。個々の物理ブロックは、ファイルに送信された (128 バイトまでの) データとコンパイラーが挿入する 2 つの 1 バイトの "長さバイト" から構成されます。長さバイトは、各レコードの開始位置と終了位置を示します。
論理レコードとは、1 つまたは複数の物理ブロックを含む書式なしレコードを示します。(次の図を参照) 論理レコードの大きさは任意です。コンパイラーは、必要な数の物理ブロックを使用します。
複数の物理ブロックから構成される論理レコードを作成する際、コンパイラーは長さバイトを 129 に設定して、現在の物理ブロックのデータが次の物理ブロックに継続されることを示します。例えば、140 バイトのデータを書き出すと、論理レコードの構造は次の図のようになります。
書式なしシーケンシャル・ファイルの最初と最後のバイトは予約されています。最初のバイトには値 75 が、最後のバイトには値 130 が含まれています。Fortran は、これらのバイトをエラーチェックとファイル終了の参照に使用します。
次のプログラムは、下の図で示される書式なしシーケンシャル・ファイルを作成します。
! 注: ファイルはデフォルトでシーケンシャル
! -1 は 16 進値では FF FF FF FF
!
CHARACTER xyz(3)
INTEGER(4) idata(35)
DATA idata /35 * -1/, xyz /'x', 'y', 'z'/
!
! ファイルを開いて 140 バイトのレコードを書き込む:
! 128 バイト (ブロック) + 12 バイト = 140 バイトの IDATA、そして 3 バイトの XYZ
OPEN (3, FILE='UFSEQ',FORM='UNFORMATTED')
WRITE (3) idata
WRITE (3) xyz
CLOSE (3)
END
書式なし直接ファイルは、一連の書式なしレコードです。レコードの読み書きは任意の順序で行うことができます。すべてのレコードは、OPEN 文の RECL 指定子で指定された同じ長さです。レコードを区切ったり、レコードの構造を指示する区切りバイトはありません。
書式なし直接ファイルには部分的なレコードを書き出すことができます。インテル® Fortran は、ASCII の NULL 文字を使用し、これらのレコードを固定レコード長まで埋めます。ファイル内の書き出されなかったレコードには未定義のデータが含まれます。
次のプログラムでは、下の図のようなサンプルの書式なし直接ファイルを作成します。
OPEN (3, FILE='UFDIR', RECL=10,&
& FORM = 'UNFORMATTED', ACCESS = 'DIRECT')
WRITE (3, REC=3) .TRUE., 'abcdef'
WRITE (3, REC=1) 2049
CLOSE (3)
END
バイナリー・シーケンシャル・ファイルは、同じ順序で読み書きされる一連の値で構成され、値は、2 進数としてファイルに格納されます。レコードの境界は存在せず、ファイル構造を示す特殊なバイトもありません。データは、書式や長さなどを変更せずに読み書きされます。I/O データ項目の種類に関係なく、メモリー内の一連のバイトは、そのままの書式でファイルに格納されます。
次のプログラムは、下の図で示されるバイナリー・シーケンシャル・ファイルを作成します。
! 注: 07 はベル文字
! デフォルトでシーケンシャルを仮定
!
INTEGER(1) bells(4)
CHARACTER(4) wys(3)
CHARACTER(4) cvar
DATA bells /4*7/
DATA cvar /' is '/,wys /'What',' you',' see'/
OPEN (3, FILE='BSEQ',FORM='BINARY')
WRITE (3) wys, cvar
WRITE (3) 'what ', 'you get!'
WRITE (3) bells
CLOSE (3)
END
バイナリー直接ファイルは、レコードを一連の 2 進数として格納します。ファイル内のレコードは、任意の順序で参照することができます。また、ファイル内のすべてのレコードは、OPEN 文の RECL 引数で指定されたレコード長を持ちます。バイナリー直接ファイルにはレコードを部分的に書き込むことができます。レコードの使用されない部分には、未定義のデータが含まれます。
読み取り操作または書き込み操作は、ファイル内の次のレコードに対して操作を継続することにより、レコードに含まれるデータよりも多くのデータを転送することができます。このような操作を書式なし直接ファイルに行うと、エラーが発生します。書式なし直接ファイルに対して実行可能な I/O 操作は、その操作がレコード内のパディングされたゼロに依存しない限り、バイナリー直接ファイルに対して行われたときと同じ結果を生成します。
次のプログラムでは、下の図のようなバイナリー直接ファイルを作成します。
OPEN (3, FILE='BDIR',RECL=10,FORM='BINARY',ACCESS='DIRECT')
WRITE (3, REC=1) 'abcdefghijklmno'
WRITE (3) 4,5
WRITE (3, REC=4) 'pq'
CLOSE (3) END