記録形式

I/O 記録は,互いに論理的に関連しており,1 つの単位として処理される欄と呼ばれるデータ項目の集まりです。記録形式とは,記録欄の格納方法に関する規約のことです。

ファイル内のデータ記録形式は,ファイル属性としては保持されていません。ファイル作成に使われた記録形式とは別の記録形式を使った場合,結果は不定です。

コンパイル時に /fpscomp:ioformat を省略した場合,次の 6 つの記録形式が使用できます。

記録形式 利用可能なファイル編成と可搬性の考察
固定長 相対編成ファイルまたは順番編成ファイル
可変長 順番編成ファイルのみ。可変長記録形式は,一般にマルチベンダ・プラットフォーム間での可搬性が最も高い記録形式です。
セグメント 順番編成ファイルでのみ使用でき,書式なし順番探査だけが使用できます。セグメント記録形式は,Compaq Fortran に特有のもので,Fortran 以外の言語で書かれたプログラムや,Compaq Fortran が使用されていない場所への可搬性を目的としている場合,使用してはなりません。ただし,セグメント記録形式は,Compaq Fortran 製品に特有のものなので,セグメント・ファイル中の書式付きデータは,異なる Compaq Fortran プラットフォーム間で移植することができます。
ストリーム (記録終端文字を使用しない) 順番編成ファイルのみ
ストリーム CR (記録終端文字として CR を使用する) 順番編成ファイルのみ
ストリーム LF (記録終端文字として CR と LF を使用する) 順番編成ファイルのみ

固定長記録

固定長記録を指定すると,ファイル内のすべての記録が同じバイト数を含むことを指定したことになります。固定長記録を格納するファイルを開くときには,RECL キーワードを使って記録長を指定する必要があります。直接探査のために開かれた順番編成ファイルは,ファイル内の記録位置を正しく計算できるように,固定長記録を含んでいなくてはなりません。

相対編成ファイルの場合,固定長記録の構成とオーバーヘッドは,ファイルを探査するプログラムが /vms オプションを使ってコンパイルされたのか,/vms オプションが省略されたのかに依存します。

次図に固定長記録の構成を示します。

可変長記録

可変長記録は,指定された最大記録長まで任意のバイト数を含むことができ,順番編成ファイルにのみ適用されます。これらの記録には,一般にカウント欄を含む 4 バイトの制御情報が前後に追加されます。各カウント欄に格納された 4 バイトの整数値は,その特定の可変長記録中のデータ・バイト (オーバヘッド・バイトを除く) の数を示します。

次図に可変長記録の構成を示します。

可変長記録のカウント欄は,Q 形書式記述子を指定して READ 文を発行することで記録を読み取ったときに取得することができます。その後,このカウント欄情報を使って,関連付けられた I/O 並びに何バイトが含まれているかを知ることができます。

Compaq Fortran プログラムが可変長記録を使って書き出したファイルには,通常は,テキスト・ファイルとしては探査できません。可変長記録を含んだテキスト・ファイルを出力したい場合,代わりにストリーム LF 記録形式を使用してください。

セグメント記録

セグメント記録は,順番編成ファイル内の 1 つまたは複数の可変長書式なし記録で構成される 1 つの論理記録です。順番探査を使って順番編成ファイルに書き出された書式なしデータは,基本設定ではセグメント記録として格納されます。

セグメント記録は,例外的に長い記録を書き出したいが,たとえば仮想メモリーの制限のためにプログラムの実行が妨げられる可能性があり,1 つの長い可変長記録を定義することはしたくない場合に便利です。より小さなセグメント記録を使用することで,プログラムが実行されるシステムで,仮想メモリーの制限によって問題が引き起こされる可能性を小さくすることができます。

ディスク・ファイルの場合,セグメント記録は 1 つまたは複数のセグメントから構成される 1 つの論理記録です。各セグメントは 1 つの物理記録です。セグメント (論理) 記録は,絶対最大記録長 (21.4 億バイト) を超えることができますが,個々のセグメント (物理記録) は最大記録長を超えることはできません。

セグメント記録を含んでいる書式なし順番編成ファイルに探査するには,ファイルを開くときに FORM='UNFORMATTED'RECORDTYPE='SEGMENTED' を指定します。さもないと,ファイルの処理がおかしくなることがあります。

次図に示したように,セグメント記録の構成では,4 バイトの制御情報の後にユーザー・データが続いています。

制御情報は,2 バイトの整数の記録長カウンター (セグメント識別子が使用する 2 バイトを含む) の後に,このセグメントを次のいずれかとして識別する 2 バイトの整数セグメント識別子を続けたものから構成されています。

指定された記録長が奇数だった場合,ユーザー・データには 1 つの空白 (1 バイト) が充填されますが,この余分なバイトは 2 バイトの整数の記録長カウンターには追加されません。

ストリーム・ファイル・データ

ストリーム・ファイルは記録単位にはグループ化されておらず,制御情報を含んでいません。ストリーム・ファイルは CARRIAGECONTROL='NONE' で使用され,入力または出力文で指定された変数の範囲でのみ読み書きされる文字または 2 進データを含んでいます。

次図はストリーム・ファイルの構成を示しています。

ストリーム CR 記録

ストリーム CR 記録は,カウンターではなく,データに埋め込まれた明示的な記録終端文字によって長さが指定される可変長記録です。これらの終端文字は,ストリーム形式のファイルに記録を書き出したときに自動的に追加され,記録を読み取ったときに削除されます。ストリーム CR ファイルは終端文字として復帰のみを使用するので,ストリーム CR ファイルには埋め込み復帰文字が含まれていてはなりません。

次図はストリーム CR 記録の構成を示しています。

ストリーム LF 記録

ストリーム LF 記録は,カウンターではなく,データに埋め込まれた明示的な記録終端文字によって長さが指定される可変長記録です。これらの終端文字は,ストリーム形式のファイルに記録を書き出したときに自動的に追加され,記録を読み取ったときに削除されます。ストリーム LF ファイルは終端文字として復帰の後に改行が続いたものを使用するので,ストリーム LF ファイルには埋め込み改行文字が含まれていてはなりません。これは通常のオペレーティング・システムのテキスト・ファイルの記録形式です。

次図はストリーム LF 記録の構成を示しています。