書式仕様

書式仕様は FORMAT 文または文字式に入れることができます。FORMAT 文では,その前にキーワード FORMAT が付けられます。書式仕様は次の形式を取ります。

(format-list)

format-list
以下に示す編集記述子を,コンマまたは斜線 (/) で区切って 1 つまたは複数個を指定した並びです。

データ編集記述子 I, B, O, Z, F, E, EN, ES, D, G, L, A
制御編集記述子 T, TL, TR, X, S, SP, SS, BN, BZ, P, :, /, $, \, Q
文字列編集記述子 H, 'c', "c"c は文字定数。

以下の場合は,コンマを省略することができます。

編集記述子は入れ子にすることができ,データ編集記述子,斜線編集記述子,または括弧で囲まれた編集記述子並びの前には書式反復数を置くことができます。

規則と振る舞い

FORMAT 文は文番号付きでなくてはなりません。

書式仕様では,名前付き定数は使用できません。

結合された I/O 文が I/O 並びを含んでいる場合,書式仕様は少なくとも 1 つのデータ編集記述子か,Q 形制御編集記述子を含んでいなくてはなりません。

最初の左括弧の前には空白文字を置くことができます。また,書式仕様中の任意の場所にも空白を追加することができます。これらの空白は,文字列編集記述子の中にある場合を除いて意味を持ちません。

書式付き入力文が実行されるときには,(関連する論理装置に対する) BLANK 指定子の設定が,仕様中の空白の解釈を決定します。書式付き入力文に対して BN 形または BZ 形編集記述子が指定されている場合,それらは基本空白解釈よりも優先されます (BLANK の基本設定については,「OPEN」の「BLANK 指定子」を参照してください)。

書式付き入力では,外部欄区切り子としてコンマを使用します。コンマは,期待される文字数よりも短い (文字以外のデータ型の) 欄の入力を終了させます。また,これは空 (長さゼロの) 欄も指定することができます。

ライン・プリンタまたはターミナルに送信される記録の最初の文字は,通常は復帰制御に使用され,印字されません。このような記録の最初の文字は,空白,01$+または ASCII NUL にしてください。これ以外の文字は空白として扱われます。

書式仕様は,外部記録が含むことができるよりも多くの出力文字を指定することはできません。たとえば,ライン・プリンタ記録は,復帰制御文字を含めて 133 文字よりも多くの文字を含むことはできません。

次表は,書式仕様で使用できる編集記述子を要約しています。

編集記述子の要約

コード 書式 効果
A A[w] 文字列またはホレリス値を転送します。
B Bw[.m] 2 進値を転送します。
BN BN 数値入力欄中の埋め込み空白と末尾の空白を無視します。
BZ BZ 数値入力欄中の埋め込み空白と末尾の空白をゼロとして扱います。
D Dw.d D の指数部を持つ実数値を転送します。
E Ew.d[Ee] E の指数部を持つ実数値を転送します。
EN ENw.d[Ee] 工学表記の形で実数値を転送します。
ES ESw.d[Ee] 科学表記の形で実数値を転送します。
F Fw.d 指数部なしの実数値を転送します。
G Gw.d[Ee] すべての組込み型の値を転送します。
H nHch[ch...] H 形編集記述子の後に続く文字列を出力記録に転送します。
I Iw[.m] 10 進の整数値を転送します。
L Lw 論理値を転送します。入力の際に文字列を転送します。出力の際に T または F を転送します。
O Ow[.m] 8 進値を転送します。
P kP 一部の実数を指定されたけた移動数をもとに解釈します。
Q Q 入力記録に残っている文字数を返します。
S S 数値出力欄中の省略可能なプラス記号 (+) を元に戻します。SPSS の作用を取り消します。
SP SP 数値出力欄に省略可能なプラス記号 (+) を書き込みます。
SS SS 数値出力欄の任意正符号 (+) を抑止します。
T Tn 指定された位置に移動します。
TL TLn 指定された位置の数だけ左に移動します。
TR TRn 指定された位置の数だけ右に移動します。
X nX 指定された位置の数だけ飛び越します。
Z Zw[.m] 16 進値を転送します。
$ $ 対話型 I/O の際に,末尾の復帰を抑止します。
: : I/O 並びに項目がなくなった場合,書式制御を終了させます。
/ [r]/ 現在の記録を終了させ,次の記録に移動します。
\ \ 同じ記録を継続します。$ と同じ。
'c' 1 'c' 文字定数表現 (区切り文字に囲まれているもの) を出力記録に転送します。
1 これらの区切り文字は引用符 (") であってもかまいません。

文字書式仕様

データ転送 I/O 文における書式指定子 ([FMT=]format) には,文字配列,文字配列要素,または文字定数の文字式を使用することができます。この形式の書式は,プログラムの実行中に作成または変更することができるので実行時書式とも呼ばれます。

式は,その先頭部分が (外側の括弧を含めて) 有効な書式仕様であるような文字列として評価されなくてはなりません。

式が文字配列要素である場合,書式仕様は全体がその要素内に含まれていなくてはなりません。

式が文字配列である場合,書式仕様は最初の要素を越えて,それ以降の連続する要素にまで継続することができます。

式がアポストロフィで区切られた文字定数である場合,書式仕様中でアポストロフィを指定するには,2 つの連続したアポストロフィ ('') を使用します。

	PRINT '("NUM can''t be a real number")'

同じように,式が引用符で区切られた文字定数である場合,書式仕様中で引用符を指定するには,2 つの連続した引用符 ("") を使用します。

連続したアポストロフィや引用符を使うのを避けるには,文字定数を書式仕様ではなく I/O 並びに入れます。

	PRINT "(A)", "NUM can't be a real number"

次の例も,文字書式仕様を示しています。

	WRITE (6, '(I12, I4, I12)') I, J, K

次の例では,書式仕様は,DO ループ反復のたびに変化します。

	SUBROUTINE PRINT(TABLE)
	REAL TABLE(10,5)
	CHARACTER*5 FORCHR(0:5), RPAR*1, FBIG, FMED, FSML
	DATA FORCHR(0),RPAR /'(',')'/
	DATA FBIG,FMED,FSML /'F8.2,','F9.4,','F9.6,'/
	DO I=1,10
	  DO J=1,5
	    IF (TABLE(I,J) .GE. 100.) THEN
	      FORCHR(J) = FBIG
	    ELSE IF (TABLE(I,J) .GT. 0.1) THEN
	      FORCHR(J) = FMED
	    ELSE
	      FORCHR(J) = FSML
	    END IF
	  END DO
	  FORCHR(5)(5:5) = RPAR
	  WRITE (6,FORCHR) (TABLE(I,J), J=1,5)
	END DO
	END

DATA 文は,文字配列要素 FORCHR(0) に左括弧を代入し,(後に使用するために) 右括弧と 3 つの F 形編集記述子を文字変数に代入します。

次に,書式仕様に取り込むために,適切な F 形編集記述子が選択されます。この選択は,配列 TABLE の個々の要素の値の大きさに基づいて行われます。

WRITE 文の直前に,書式仕様に右括弧が追加されます。


注意:配列に格納された書式仕様は,実行時に使用されるたびに再コンパイルされます。READ 文で,ホレリスまたは文字実行時書式を使って,データを書式そのものに読み取った場合,そのデータは元の配列にコピーし直されないので,それ以降,その配列を実行時書式仕様として利用することはできなくなります。

以下の例は,書式仕様を示しています。

		WRITE (*, 9000) int1, real1(3), char1
	9000	FORMAT (I5, 3F4.5, A16)
		! I5, 3F5.2, A16 は書式並びです。

次の例では,整数変数名 MYFMTFORMAT9000 を引用しています。FORMAT 文 の前で割り当てています。

		ASSIGN 9000 TO MYFMT
	9000	FORMAT (I5, 3F4.5, A16)
		! I5, 3F5.2, A16 は書式並びです。
		WRITE (*, MYFMT) iolist

以下は,文字式を使った書式例です。

	WRITE (*, '(I5, 3F5.2, A16)') iolist
	! I5, 3F4.5, A16 は書式並びです。

以下の例では,書式並びが MYLIST と呼ばれる 80 文字の変数に置かれています。

	CHARACTER(80) MYLIST
	MYLIST = '(I5, 3F5.2, A16)'
	WRITE (*, MYLIST) iolist

次の 2 次元配列を考えます。

	1  2  3
	4  5  6

この場合,要素は次のようにメモリーに 1, 4, 2, 5, 3, 6 の順番で保存されています。

	CHARACTER(6) array(3)
	DATA array / '(I5', ',3F5.2', ',A16)' /
	WRITE (*, array) iolist

以下の例では,WRITE 文はデータ転送用の書式指定子として文字配列要素 array(2) を使っています。

	CHARACTER(80) array(5)
	array(2) = '(I5, 3F5.2, A16)'
	WRITE (*, array(2)) iolist

関連情報