【Fortran学習|初心者向け】Fortranの隠れた便利機能!内部ファイルを使って数値と文字列を自由自在に変換しよう

1. 導入:なぜ内部ファイルが重要なのか?

数値計算の現場では、計算結果に応じてファイル名を動的に変えたり、ログ出力のために数値を文字列として扱いたい場面が頻繁にあります。そんな時、「どうやって数値を文字列に変換しよう?」と悩むことはありませんか?
Fortranの「内部ファイル(Internal Files)」を使えば、特別なライブラリを導入することなく、標準の入出力コマンド(WRITE/READ)を使って、メモリ上でスマートに型変換を行うことができます。これは、C言語のsprintfやsscanfに相当する、極めて高速かつ安全な手法です。

2. 基礎知識:内部ファイルとは?

通常、WRITE文やREAD文はファイルや画面を対象にしますが、対象を「文字変数(CHARACTER型)」に指定することで、その変数をファイルのように扱うことができます。
メリット
・ハードディスクへの書き込みが発生しないため、動作が非常に高速。
・Fortranのフォーマット指定(I, F, E形式など)をそのまま利用できる。
・複雑な文字列結合を直感的に記述できる。

3. 実装・解決策

使い方は簡単です。WRITE文の第1引数にファイル装置番号ではなく「文字変数」を指定するだけです。
例えば、計算のループ回数(rank)をファイル名の一部として使いたい場合、数値を一度文字変数に変換し、それをファイル名用の文字列と結合(//演算子)することで、動的なファイル生成が可能になります。

4. サンプルプログラム

以下のコードをコピー&ペーストして、コンパイル・実行してみてください。

program internal_file_test
    implicit none
    character(len=20) :: str      ! 数値変換用の一時変数
    character(len=50) :: file_name ! 生成されるファイル名
    integer :: rank = 123         ! 数値データ

    ! 1. 数値を文字列に変換 (WRITE文の第一引数に文字変数を指定)
    ! (I0)は「桁数指定なしで整数を詰めて出力する」という指定
    write(str, '(I0)') rank

    ! 2. 文字列を結合してファイル名を作成
    ! trim()を使って、数値の余分な空白を除去
    file_name = "output_" // trim(str) // ".dat"

    ! 結果の確認
    print , "生成されたファイル名: ", file_name

    ! 応用:逆に文字列から数値を取り出す(READ文)
    read(str, ) rank
    print , "文字列から戻した数値: ", rank
end program internal_file_test

5. 応用・注意点

空白に注意:WRITE文で数値を出力すると、デフォルトでは固定幅(右詰め)で空白が入ることがあります。必ず ‘(I0)’ や ‘(F0.0)’ のように、幅指定を省略する「0」指定を行うことで、余計な空白を含めずに変換できます。
文字列の長さ:変換先の文字変数の長さ(len)が不足すると、実行時エラーになる可能性があります。数値の桁数に対して十分な長さを確保しましょう。
デバッグの活用:複雑なデータ構造をログとして出力する際、内部ファイルを使って一旦メモリ上で文字列化してからPRINTすることで、フォーマットを細かく制御したきれいなログを出力することも可能です。

この技術をマスターして、柔軟なファイル管理とスマートなコード作成を目指しましょう。

コメント

タイトルとURLをコピーしました