1. 導入
数値計算の現場では、データファイルから値を読み込む処理は基本ですが、ファイルの行数が不明な場合、どのようにループを制御するかは非常に重要です。多くのエンジニアがIOSTAT変数を用いた判定を行いますが、今回紹介する「END=分岐」を活用することで、条件分岐を最小限に抑え、コードの可読性を高めることができます。特に小規模なデータセットや、スクリプト的に動作する解析プログラムにおいて、非常に強力なツールとなります。
2. 基礎知識
Fortranにおいて、EOF(End Of File)とはファイルの終端を指します。通常の読み込み処理中にEOFに達すると、プログラムはエラー(実行時エラー)を発生させて停止してしまいます。これを防ぐために用意されているのがEND指定子です。END=ラベルを指定することで、ファイル末尾に達した瞬間に指定したラベルへ制御を移し、プログラムを安全に終了させる、あるいは後処理へ移行させることが可能になります。
3. 実装/解決策
READ文の構文に「end=ラベル番号」を追加するだけで実装できます。ループの先頭でREADを行い、読み込みに成功すれば次の処理へ、EOFに達したら即座に読み込みループを抜けるという流れを作るのが一般的です。これにより、ループのたびにIOSTAT変数の値を判定するif文を記述する必要がなくなり、メインのロジックがすっきりと整理されます。
4. サンプルプログラム
以下のコードは、数値が記述されたテキストファイルを読み込み、合計値を計算する実用的な例です。
program read_example
implicit none
integer :: unit_num, iostat_val
real :: value, total
total = 0.0
unit_num = 10
! ファイルを開く
open(unit=unit_num, file='data.txt', status='old')
! 無限ループで読み込みを行う
do
! end=999 を指定することで、EOF到達時に999へジャンプする
read(unit_num, , end=999) value
! 読み込んだ値を積算する
total = total + value
end do
999 continue ! EOF到達時にここへ飛ぶ
print , "データの読み込みが完了しました。"
print , "合計値: ", total
close(unit_num)
end program read_example
5. 応用・注意点
END=分岐は簡潔ですが、注意点もあります。第一に、読み込みエラー(データの型不一致など)が発生した場合、END指定子だけでは捕捉できない点です。より堅牢なプログラムを作成する場合は、IOSTATを併用してエラーの種類を判別するのが推奨されます。
また、現代的なプログラミングスタイルでは、あまりに遠いラベルへのジャンプは「スパゲッティコード」の元になります。END=分岐を使用する際は、できるだけ読み込みループのすぐ直後にラベルを配置し、処理の局所性を保つよう心がけてください。小規模なツールであれば非常に有用ですが、大規模なシステム開発では、例外処理の設計と併せて慎重に使い分けることが、エンジニアとしてのスキルアップに繋がります。

コメント