概要
fortranで外部テキストファイルに書かれている行列データを読み込むときには、下記のようにすると、読み取れるし、最終行を検知できる。
read (10, *, iostat=ios) x
背景
物理、天文学という古くからある分野に関わっていると、fortranが第一プログラミング言語という人も多い。
私もその中の一人で、社会に出てみると、まるで古典文学を書く人という扱いを同僚からうける。
しかし、fortranはまだ大活躍中の言語であり、スーパーコンピュータでの配列計算にはよく使われる言語である。
今回はそんな言語の基本中の基本であるファイル読み込みの仕方を記す。
課題
とにかくプログラム外部にあるテキストファイルの中身を読みたい。
読み込んだ値をプログラム内の計算に使いたい。
fortranの場合、読み込んだファイルの最後を検出しないとエラーがでる。
なので、ファイルの最後になったら、ちゃんと正しく終了する。
解決法
下記のようなテキストファイルdata.txtを読み込みたいとする。
<data.txt>
1000 10 100
2000 20 400
3000 30 900
4000 40 1600
上記の例では4行であるが、実際には何行あるか分からないとする。
これを読み込んで真ん中の列の総和を計算するコードを例にして説明する。
<fortran_sum.f90>
program fortran_sum
implicit none !未宣言変数の使用禁止
integer x, y, z !読み込み時に使用する変数3つ
integer sum_y !総和計算値を格納する変数
integer i !ループを回すための変数
integer ios !ファイルの終了を読み取る変数
sum_y = 0 !初期化
ios = 1 !初期化
open(10, file="data.txt") !読み出しファイルを開く
do i=0, 1000, 1 !読み出しのループ。ファイル行数よりも十分なループ回数を指定する
read(10, *, iostat=ios) x, y, z !ファイル内の一行を読み出す。同時にiostatを取得
if (ios < 0) exit !最終行ならループを抜ける
sum_y = sum_y + y !総和計算
end do !ループ終了
close(10) !読み出しファイルを閉じる
print *, sum_y !結果を出力する。
end program
コード内の「<」は「<」と置き換えてください。
テキストファイルの読み出しは、基本的にはopenして、read分で一行ずつ読み込んでいく。
openしたときの番号(上記では10)を装置番号といって、read時にこれを記載することで、読み込みの対象を指定する。
read分のiostat=iosの部分でiosにそのときの読み出しがどうだったかが格納される。
ファイル終了という場合には、iosには-1が格納されるので、その次の行の判断でループを抜けることになる。
応用
read文の変数を配列にすることもできる。
読み取る対象がたくさんある時には、read文の変数を配列にすると便利。
下記の場合なら10個の値を取得できる。
<fortran_sum_10.f90>
program fortran_sum
implicit none !未宣言変数の使用禁止
integer x(10) !読み込み時に使用する変数3つ
integer sum_y !総和計算値を格納する変数
integer i !ループを回すための変数
integer ios !ファイルの終了を読み取る変数
sum_y = 0 !初期化
ios = 1 !初期化
open(10, file="data.txt") !読み出しファイルを開く
do i=0, 1000, 1 !読み出しのループ。ファイル行数よりも十分なループ回数を指定する
read(10, *, iostat=ios) x !ファイル内の一行を読み出す。同時にiostatを取得
if (ios < 0) exit !最終行ならループを抜ける
sum_y = sum_y + x(4) !4列目のデータの総和計算
end do !ループ終了
close(10) !読み出しファイルを閉じる
print *, sum_y !結果を出力する。
end program
コード内の「<」は「<」と置き換えてください。
追加情報
今回は読み込みの変数が整数型(int)たっだが、他の型(例えばfloat型や文字型)を読み込みたいときには変数宣言時にその型で宣言しておく必要がある。
参考
fortranとは:
https://ja.m.wikipedia.org/wiki/FORTRAN
おススメのプログラミング独学方法はこちらの記事にまとめました!
コメント