Fortranで数値計算の結果やデータを思い通りに出力・入力したいとき、FORMAT
文(または書式指定子)が非常に役立ちます。これを使うと、数値の桁数、小数点以下の表示、文字の配置などを細かく制御できます。
FORMAT文とは?
READ
文やWRITE
文(PRINT
文も含む)でデータの入出力を行う際、そのデータの「形」を指定するのがFORMAT
文の役割です。例えば、「整数を5桁で表示したい」「実数を小数点以下3桁まで表示したい」といった要望に応えられます。
書式指定は、主に2つの方法で行います。
WRITE
文やREAD
文の中に直接書式を書く方法:WRITE(*, '(書式指定子)') 変数リスト READ(*, '(書式指定子)') 変数リスト
*
は標準出力(通常は画面)や標準入力(通常はキーボード)を意味します。2番目の引数に書式指定子を文字列として記述します。- 別行に
FORMAT
文を用意し、文番号で参照する方法:WRITE(*, 100) 変数リスト 100 FORMAT(書式指定子) READ(*, 200) 変数リスト 200 FORMAT(書式指定子)
WRITE
文やREAD
文の2番目の引数に文番号(例:100
,200
)を指定し、対応するFORMAT
文で書式を定義します。FORMAT
文はプログラム内のどこに書いても良いですが、参照するWRITE/READ
文の近くか、プログラムの最後にまとめて書くスタイルが一般的です。
どちらの方法でも同じことができますが、複雑な書式や同じ書式を何度も使う場合は、FORMAT
文を使うとコードがすっきりすることがあります。
主要な書式記述子(エディットディスクリプタ)
FORMAT
文や書式指定文字列の中には、「書式記述子」と呼ばれるコードを記述します。よく使われるものをいくつか紹介します。
記述子 | 形式例 | 説明 | 例 (出力値) |
---|---|---|---|
I | Iw , Iw.m | 整数 (Integer)。w は全体の桁数(フィールド幅)。m は最小表示桁数(足りない場合は前に0が付く)。 | WRITE(*,'(I5)') 123 → ␣␣123 WRITE(*,'(I5.4)') 123 → ␣0123 |
F | Fw.d | 実数(固定小数点形式, Fixed-point)。w は全体の桁数(符号、小数点を含む)、d は小数点以下の桁数。 | WRITE(*,'(F7.3)') 12.345 → 12.345 WRITE(*,'(F8.2)') -12.345 → ␣-12.35 (四捨五入) |
E | Ew.d , Ew.dEe | 実数(指数形式, Exponential)。w は全体の桁数、d は仮数部の小数点以下の桁数。e は指数部の桁数。科学技術計算で大きな値や小さな値を扱う際に便利です。 | WRITE(*,'(E12.5)') 12345.6 → ␣0.12346E+05 |
ES | ESw.d , ESw.dEe | 実数(科学形式, Scientific)。E と似ていますが、仮数部が 1 ≤ |仮数| < 10 の形になるように調整されます。 | WRITE(*,'(ES12.5)') 12345.6 → ␣1.23456E+04 |
EN | ENw.d , ENw.dEe | 実数(工学形式, Engineering)。指数部が3の倍数になるように調整されます (例: E+03, E-06)。 | WRITE(*,'(EN12.4)') 12345.6 → 12.3456E+03 |
G | Gw.d , Gw.dEe | 汎用 (General)。数値の大きさに応じてF 形式かE (またはES )形式を自動で選択してくれます。便利ですが、出力形式が揃わない可能性もあります。 | WRITE(*,'(G12.5)') 12.3456 → ␣␣12.346␣␣ WRITE(*,'(G12.5)') 1234567.8 → ␣0.12346E+07 |
A | A , Aw | 文字 (Character)。w を指定すると、その幅で出力します。指定しない場合、文字変数の長さで出力されます。w が文字長より短い場合は先頭からw 文字、長い場合は右詰めで空白が追加されます。 | CHARACTER(LEN=5) :: str = "Hello" → Hello WRITE(*,'(A3)') str → Hel WRITE(*,'(A7)') str → ␣␣Hello |
L | Lw | 論理値 (Logical)。通常、T (真) または F (偽) として出力されます。w はフィールド幅。 | LOGICAL :: flag = .TRUE. → ␣T |
X | nX | 空白 (Space)。n 個の空白を挿入します。出力の位置調整に使います。 | WRITE(*,'(I3, 3X, I3)') 10, 20 → ␣10␣␣␣␣20 |
T | Tn , TLn , TRn | タブ (Tabulation)。Tn は絶対位置n へ移動。TLn は現在位置から左へn 文字移動。TRn は現在位置から右へn 文字移動。 | WRITE(*,'(I5, T10, I5)') 1, 2 → ␣␣␣␣1␣␣␣␣␣␣␣␣2 (10桁目から2番目の整数) |
/ | / | 改行 (New Line)。出力時に新しい行を開始します。 | WRITE(*,'(A, /, A)') "Line 1", "Line 2" → Line 1 |
' ' , " " | '文字列' , "文字列" | 文字定数。指定した文字列をそのまま出力します。 | WRITE(*,'("Value = ", F5.2)') 1.23 → Value = ␣1.23 |
繰り返し | r(記述子) , r記述子 | 同じ書式記述子をr 回繰り返します。 | WRITE(*,'(3I5)') 1, 2, 3 → ␣␣␣␣1␣␣␣␣2␣␣␣␣3 (I5, I5, I5 と同じ) |
Note: ␣
は空白文字を表します。
Note: w
(フィールド幅)が指定された値を出力するのに足りない場合、多くの処理系ではフィールド全体がアスタリスク (*
) で埋められます。
使用例
いくつかのデータ型を組み合わせて出力してみましょう。
PROGRAM format_example IMPLICIT NONE INTEGER :: id = 101 REAL :: temperature = 25.678 CHARACTER(LEN=10) :: status = "OK" LOGICAL :: is_valid = .TRUE. ! WRITE文の中に直接書式を書く例 WRITE(*, '("ID:", I4, 3X, "Temp:", F7.2, 3X, "Status:", A, 3X, "Valid:", L1)') & id, temperature, status, is_valid ! FORMAT文を使う例 WRITE(*, 100) id, temperature, status, is_valid
100 FORMAT("ID:", I4, 3X, "Temp:", F7.2, 3X, "Status:", A, 3X, "Valid:", L1)
END PROGRAM format_example
このプログラムを実行すると、おそらく以下のような出力が得られます(空白の数に注意してください)。
ID: 101 Temp: 25.68 Status:OK Valid:T
ID: 101 Temp: 25.68 Status:OK Valid:T
I4
: 整数id
を4桁で出力 (␣101
)。3X
: 3つの空白を挿入。F7.2
: 実数temperature
を全体7桁、小数点以下2桁で出力 (␣␣25.68
)。四捨五入されていますね。3X
: 3つの空白を挿入。A
: 文字列status
をその長さ(10文字)で出力 (OK␣␣␣␣␣␣␣␣␣␣
)。右側に空白が詰められています。もしA2
ならOK
だけが出力されます。3X
: 3つの空白を挿入。L1
: 論理値is_valid
を1桁で出力 (T
)。
注意点
- フィールド幅 (
w
): 出力する値(符号、小数点、指数部などを含む)に対して十分な幅を指定しないと、アスタリスク(*****
)で埋められてしまうことがあります。特に実数型では、符号や小数点も桁数に含まれる点に注意が必要です。 - READ文での書式:
READ
文で書式を指定する場合、入力データの形式と書式指定が厳密に一致している必要があります。少しでもずれていると、予期せぬ値が読み込まれたり、エラーが発生したりします。自由形式の入力 (READ(*,*)
) の方が扱いやすい場合も多いです。 - 文字定数: 書式内で文字列を出力するには、シングルクォート
'
またはダブルクォート"
で囲みます。 - 繰り返しとグループ化: 括弧
()
を使って書式記述子をグループ化し、そのグループを繰り返すことも可能です。例:'(2(I5, 2X))'
は'(I5, 2X, I5, 2X)'
と同じ意味になります。
まとめ
FORMAT
文(書式指定子)は、Fortranでの入出力をより柔軟かつ精密に制御するための強力な機能です。特に、整形されたレポートや、他のプログラムが読み込むための特定の形式でデータファイルを出力する場合に不可欠です。
最初は少し複雑に感じるかもしれませんが、基本的な書式記述子から試してみて、徐々に慣れていきましょう!
参考情報
- Fortran Standards Documents (規格書): 最新のFortran規格に関する正確な情報源です。(多くの場合、有料または特定の機関経由でのアクセスが必要です)
- Fortran-lang Tutorial – Input/Output: https://fortran-lang.org/learn/quickstart/input_output (基本的な入出力と書式指定について触れられています)
- TutorialsPoint – Fortran Basic Input Output: https://www.tutorialspoint.com/fortran/fortran_basic_input_output.htm (書式記述子の表などが参考になります)
これらのリソースや、利用しているコンパイラのドキュメントも参照して、理解を深めてください。