書式制御は,書式付き I/O 文の実行から始まります。書式制御の個々の動作は,I/O 並び中の次の項目 (存在する場合) と,書式仕様中の次の編集記述子の両者が与える情報に依存します。
I/O 並びと書式仕様は,書式反復数や DO 形反復がない限り,左から右の順に解釈されます。
I/O 並びが少なくとも 1 つの並び項目を指定している場合,書式仕様には少なくとも 1 つのデータ編集記述子 (I,B,O,Z,F,E,EN,ES,D,G,L,A),または Q 形編集記述子が存在していなくてはなりません。さもないとエラーが発生します。
個々のデータ編集記述子 (または Q 形編集記述子) は,I/O 並び中の 1 つの項目に対応します。ただし,複素数型の I/O 並び項目の場合は例外で,2 つの F 形,E 形,EN 形,ES 形,D 形,または G 形編集記述子が解釈される必要があります。制御編集記述子 (X,P,T,TL,TR,SP,SS,S,BN,BZ,$,または :),または文字列編集記述子 (H 形と文字定数) には,I/O 並び項目は対応しません。文字列編集記述子の場合,データ転送は外部記録と書式仕様の間で直接に行われます。
書式制御は,書式仕様中でデータ編集記述子を発見すると,対応する I/O 並び項目が指定されているかどうかを判断します。そのような項目が存在する場合,編集記述子の制御下で転送され,書式制御は先に進みます。対応する I/O 並び項目が存在しなければ,書式制御は終了します。
処理すべき I/O 並び項目がそれ以上存在しない場合,以下の条件が満たされていると,書式制御はやはり終了します。
コロン編集記述子が現れた。
書式仕様の終わりに達した。
I/O 並び項目がまだ残っている場合,書式仕様の一部またはすべてが書式制御の戻りで再利用されます。
書式制御の戻りでは,現在の記録が終了し,新しい記録が開始されます。その後,書式制御は以下のいずれかの場所に (以下に示した優先順位で) 戻り,そこから処理を続行します。
書式仕様の最後から 2 番目の右括弧に対応する左括弧を持っているグループ書式反復数
書式仕様の最初の左括弧
書式制御の戻りは,けた移動数 (P),符号編集記述子 (S,SP,SS),または空白編集記述子 (BN,BZ) には影響を与えません。
例
ファイル FOR002.DAT 中のデータは,一度に 2 記録ずつ処理するようになっています。各記録は,ベクトル B の要素に格納する数値で始まり,その後に,行列 A の行に格納する 5 つの数値が続いています。
FOR002.DAT が以下のデータを含んでいるとします。
001 0101 0102 0103 0104 0105 002 0201 0202 0203 0204 0205 003 0301 0302 0303 0304 0305 004 0401 0402 0403 0404 0405 005 0501 0502 0503 0504 0505 006 0601 0602 0603 0604 0605 007 0701 0702 0703 0704 0705 008 0801 0802 0803 0804 0805 009 0901 0902 0903 0904 0905 010 1001 1002 1003 1004 1005
以下の例は,いくつかの種類の書式仕様がファイル FOR002.DAT 中のデータを処理する際に,I/O 並びとどのような相互作用を起こすかを示しています。
書式仕様と I/O 並び間の相互作用
INTEGER I, J, A(2,5), B(2) OPEN (unit=2, access='sequential', file='FOR002.DAT') READ (2,100) (B(I), (A(I,J), J=1,5),I=1,2) 100 FORMAT (2 (I3, X, 5(I4,X), /) ) WRITE (6,999) B, ((A(I,J),J=1,5),I=1,2) 999 FORMAT (' B is ', 2(I3, X), '; A is', / (' ', 5 (I4, X)) ) READ (2,200) (B(I), (A(I,J), J=1,5),I=1,2) 200 FORMAT (2 (I3, X, 5(I4,X), :/) ) WRITE (6,999) B, ((A(I,J),J=1,5),I=1,2) READ (2,300) (B(I), (A(I,J), J=1,5),I=1,2) 300 FORMAT ( (I3, X, 5(I4,X)) ) WRITE (6,999) B, ((A(I,J),J=1,5),I=1,2) READ (2,400) (B(I), (A(I,J), J=1,5),I=1,2) 400 FORMAT ( I3, X, 5(I4,X) ) WRITE (6,999) B, ((A(I,J),J=1,5),I=1,2) END
この文は,B(1),A(1,1) から A(1,5),B(2),そして A(2,1) から A(2,5) を読み取ります。
最初に読み取られた記録 (001 で始まるもの) が,I/O 並びの処理を開始させます。
I3, X, 5(I4, X) の書式を持つ記録が 2 つあります。斜線 (/) は,A(1,5) が処理された後に,第 2 の記録を読み取らせます。また,A(2,5) が処理された後に,第 3 の記録を読み取らせます。その記録からデータは取得されません。
B is 1 2 ; A is 101 102 103 104 105 201 202 203 204 205
この文は,004 で始まる記録を読み取ります。斜線 (/) は,A(1,5) が処理された後に,次の記録を読み取らせます。コロン (:) は,A(2,5) が処理された後,斜線 (/) が新たな読み取りを引き起こす前に,読み取りを中止させます。
B is 4 5 ; A is 401 402 403 404 405 501 502 503 504 505
この文は,006 で始まる記録を読み取ります。A(1,5) が処理された後,書式制御の戻りによって次の記録が読み取られ,I3 の前の左括弧で書式処理が開始されます。
B is 6 7 ; A is 601 602 603 604 605 701 702 703 704 705
この文は,008 で始まる記録を読み取ります。A(1,5) が処理された後,書式制御の戻りによって次の記録が読み取られ,I4 の前の左括弧で書式処理が開始されます。
B is 8 90 ; A is 801 802 803 804 805 9010 9020 9030 9040 100
記録 009 0901 0902 0903 0904 0905 は,B(2) で,I4 の "009" として処理されます。これは 90 となります。X は次の "0" を読み飛ばします。その後,A(2,1) に対して "901 " が処理され,9010 となります。A(2,2) に対しては "902 ",A(2,3) に対しては "903 ",A(2,4) に対しては "904 " が処理されます。これで書式反復数 5 が使い尽くされ,書式は終了します。書式制御の戻りによって新たな記録が読み取られ,書式処理が I4 の前の左括弧から開始されます。したがって,A(2,5) に対しては "010 " が処理され,100 となります。
関連情報
データ編集記述子については,「データ編集記述子」を参照してください。
制御編集記述子については,「制御編集記述子」を参照してください。
Q 形編集記述子については,「文字数編集 (Q 形)」を参照してください。
文字列編集記述子については,「文字列編集記述子」を参照してください。
けた移動数については,「けた移動数編集 (P 形)」を参照してください。