書式仕様と I/O 並び間の相互作用

書式制御は,書式付き I/O 文の実行から始まります。書式制御の個々の動作は,I/O 並び中の次の項目 (存在する場合) と,書式仕様中の次の編集記述子の両者が与える情報に依存します。

I/O 並びと書式仕様は,書式反復数や DO 形反復がない限り,左から右の順に解釈されます。

I/O 並びが少なくとも 1 つの並び項目を指定している場合,書式仕様には少なくとも 1 つのデータ編集記述子 (IBOZFEENESDGLA),または Q 形編集記述子が存在していなくてはなりません。さもないとエラーが発生します。

個々のデータ編集記述子 (または Q 形編集記述子) は,I/O 並び中の 1 つの項目に対応します。ただし,複素数型の I/O 並び項目の場合は例外で,2 つの F 形,E 形,EN 形,ES 形,D 形,または G 形編集記述子が解釈される必要があります。制御編集記述子 (XPTTLTRSPSSSBNBZ$または :),または文字列編集記述子 (H 形と文字定数) には,I/O 並び項目は対応しません。文字列編集記述子の場合,データ転送は外部記録と書式仕様の間で直接に行われます。

書式制御は,書式仕様中でデータ編集記述子を発見すると,対応する I/O 並び項目が指定されているかどうかを判断します。そのような項目が存在する場合,編集記述子の制御下で転送され,書式制御は先に進みます。対応する I/O 並び項目が存在しなければ,書式制御は終了します。

処理すべき I/O 並び項目がそれ以上存在しない場合,以下の条件が満たされていると,書式制御はやはり終了します。

I/O 並び項目がまだ残っている場合,書式仕様の一部またはすべてが書式制御の戻りで再利用されます。

書式制御の戻りでは,現在の記録が終了し,新しい記録が開始されます。その後,書式制御は以下のいずれかの場所に (以下に示した優先順位で) 戻り,そこから処理を続行します。

  1. 書式仕様の最後から 2 番目の右括弧に対応する左括弧を持っているグループ書式反復数

  2. 書式仕様の最初の左括弧

書式制御の戻りは,けた移動数 (P),符号編集記述子 (SSPSS),または空白編集記述子 (BNBZ) には影響を与えません。

ファイル 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 となります。

関連情報