Fortran90で可変長ファイルを読む
Fortran90初心者です。
実験でたとえば
時刻 温度 流速
t1 T1 v1 (CR/LF)
... ... ...
tn Tn vn (CR/LF)
のような ascii data file (FILE.dat)を得ています。
実験ごとに n の値、つまり、行数が違っており、このファイル内のデータを
次のようなFortran.90のプログラムで読み取って、その後処理を行っています。
integer :: Nl ! number of lines
integer :: i
character(180) :: dummy_line ! for void reading
real(8), allocatable :: time(:), temp(:), velocity(:)
open (5,file='FILE.dat', status='unknown',form='formatted')
Nl = 0
do
read(5,*, end = 99) dummy_line ! void read is absurd !!
Nl = Nl + 1
end do
99 write(*,*)"eof encountered at Nl = ", Nl ! total lines in the file
allocate(time(Nl), temp(Nl), velocity(Nl)) ! allocation of variables
rewind(5) ! read pointer is set to the beginning of the file
do i=1, Nl
read(5,*) time(i), temp(i), velocity(i)
end do
この方法だと、元のファイルを2度読み込むことになりますので、あまり
賢い方法ではないと怒られています。実験データを出力する機器の方でファイルの
先頭にデータ数 n を吐き出させることもできません。
Fortran90だけでデータを読みながら動的配列を増やしてゆく方法があったら
ご教示のほどお願いします。
Cならリスト処理やreallocで可能かとも思いますし、Linux上なら wc -lと
Cのpopenとでも可能かとは思うのですが、プラットフォームはwindows7
で、intel fortranを使用しています。
(最終手段は入力部はCで、処理部はFortranで、linkするのでしょうか。)
よろしくお願いします。
お礼
>順編成ファイルでは不可能です。 やはりそうでしたか。何とかしてどうにかならないかといろいろ試していたのでこれは収穫でした。 ダイレクトアクセスでの書き出しはしたことがないのですが,これだとできる可能性はあるみたいですね。レコード長とかの知識が希薄なので,ちょっと勉強してみようと思います。ありがとうございました。