>> 概要
C言語のprint文などで使われる書式指定子と似た物で、
あらかじめ行番号を付けておき、read,write文を使うときに行番号を指定してやることで
その記述にしたがってread,writeの出力を整形する。
>> neutで使われている記述子
整数を記述する
I(アイ),少数形式の実数を記述する
F,
数字と文字の混在を記述する
A、文字列を記述する
H.
これに空白を表わす
Xが加わる。
>> 書き方の基本
(iteration)SYMBOL(arg1).(arg2)
(iteration)は、その後に続く記述を繰り返す回数。SYMBOLは記述子(IとかAとか)。
arg1は1つめのパラメータで、X以外の記述子には必ずあると思ってよい(?)。
arg1は大抵の場合桁総数となる。つまり、I9なら9桁の整数として表示する。
arg2は2つめのパラメータで、先に挙げた中ではFだけが持ち、全体のうち小数点以下の部分が何桁を占めるかを書く。
F5.2ならば、5桁のうち小数点以下が2桁の実数として表示する、となる。
iterationを指定してやると、例えば3I3とすれば、3桁の整数として出力することを3回繰り返す、という意味になる。
Xについての場合はより簡単で、5Xはスペースを5文字分空けることを表わす。
>> 改行
/(スラッシュ)で行う。iterationを指定してやれば、その数だけ行を空けることができる。
write文は1回実行する毎に自動改行するので、普通は一々これで改行する必要は無い。
>> 例
サンプルコード test.f の中身 :
implicit none
real*8 a,b,c,d
a=3.29024098
b=43081.130384
c=2495.208
d=40812
1000 format(f10.4,1x,f10.4,3x,f5.2,1x,f10.3)
write(6,1000)a,b,c,d
end
出力は次のようになる。
$ g77 -o test test.f
$ ./test
3.2902 43081.1289 ***** 40812.000
aは全9桁、小数点以下8桁の実数値である。しかし、FORMATではf10.4と指定している。
これは、全10桁、小数点以下
4桁で表示せよ、という意味なので、
まずaの小数点以下4桁までを表示し、残りをスペースで埋めている。小数点も1桁分に数えるので、
出力の左側には10-(1+1+4)=4文字分のスペースが並んでいる。
このように、format文は基本的に右詰めで考える。
次のbも同様に処理されているが、小数点以上が6桁(小数点自身も含む)なので、ちゃんと10桁分全て表示される。
次の3文字分の空白は3xによる。
さて、cの出力にあたる所は*で埋まっている。
書式はf5.2、つまり
全5桁で出力するよう要求している。
これに対してcは
全8桁。ゆえに5桁では表示しきれない。
こういう時、formatは5桁分すべてを*で埋めて返す。
最後にd.これはdouble型であるが、小数部を含まない5桁の実数である。
書式指定はf10.3で、小数点以下3桁を表示するように要求するが、dは小数部を持たない。
こういう時、formatは40812を40812.000とみなし、存在しない小数部にゼロを詰めて出力する。
ゼロを詰めても全桁数は9しかないので、余った1文字分はそのまま空ける。
cとdの間が2文字分空いているのはこういう理由による。
>> 例その2 繰り返し篇
サンプルコード iter.f の中身 :
implicit none
integer a,b,c,d
a=1
b=23
c=456
d=7890
1000 format(4I4)
write(6,1000)a,b,c,d
end
実行結果:
$ g77 -o iter iter.f
$ ./iter
1 23 4567890
今度のformat文は、4I4,すなわち"I4"を4回繰り返す、と言っている。
1000を呼んでいるwrite文が出力するのはa,b,c,dなので、ちょうどこれら4つが書式I4で出力されることになる。
しかし結果の方はと言うと、a,bはともかくcとdがくっついてしまっている。
実は、4I4はI4を間を空けることを考慮せずに4回繰り返すことを意味する。
ゆえに、出力に4桁の数が入ると、先頭がその前の出力の末尾と結合してしまう。
従って、このformatが想定しているのは4桁ではなく3桁までの整数ということになる。
>> 超参考ユーアールエル
マニュアル言葉で読みにくいが、正確
実例があり、明解
accend->neut