• 締切済み

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するのでしょうか。) よろしくお願いします。

みんなの回答

  • toxicwave
  • ベストアンサー率100% (1/1)
回答No.3

read(5,*, end = 99) dummy_line ! void read is absurd !! だとデータを読み込むことになりますが read(5,'()')であればその行をスキップすることになるので 幾分早くなるかとは思いますがいかがでしょうか? 要はこんな↓感じ Integer :: NI, stat NI = 0 DO READ(5,'()',IOSTAT = stat) IF(stat == 0) THEN NI = NI + 1 ELSE IF(stat < 0) THEN EXIT END IF END DO REWIND(5)

mikeneko_tama
質問者

お礼

回答ありがとうございました。 なるほど空読みするにしてもスキップしながら行数を数えるのですね。 形式上2度読み込むにしても、1回目は実質読んではいないので少し効率は 良くなりますね。 当初期待していたCのリスト処理に対応するものとはイメージが異なりますが、 処理が速くなるので怒られなくてすみそうです。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

C の realloc 相当のことを自力でやればいいんだろうけど.... あえて「Fortran を使わない」というオプションはなし?

mikeneko_tama
質問者

お礼

回答ありがとうございました。 はい、読み込むところをCで読み込ませて、動的配列をlist処理で格好よく確保する 部分(関数)をつくり、確保した配列をFortran90のサブルーチンに渡すことは 考えられますが、先生がFortran90/95にこだわるので…

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

例えば、nの値がわかれば1行目に入れることはできないですか? 先にわかれば前半はいらないですよね。 あるいは、nの取りうる最大値があればその最大値ぶん配列を作るというのは?

mikeneko_tama
質問者

お礼

回答ありがとうございました。 測定器が賢くないもので、最初に測定点数を吐き出してくれないのです。 最大値も長時間(たとえば2週間)測定しているときには、10万行程度になり、 1日ですと数千行なので、無駄なメモリを宣言するのも何ですので…

関連するQ&A