- ベストアンサー
FORTRANの質問です
今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? と質問しました。説明不足気味だったので、追加で説明させていただきます。 データの数はかわります。5個だったり、900個だったりします。 この数はわかりません。 program dat real n(10), y(10) write(*,*)'k=' read(*,*)k open(7,file='test.txt') do i=1,k read(7,*,end=200) n(i),y(i) end do 200 close(7) open(8,file='aftest1.txt') open(9,file='aftest2.txt') do j=1,k if(n(j).eq.0) then write(8,*) y(j) else if(n(j).eq.-1) then write(9,*) y(j) end if end do close(8) close(9) end と書いたのですがデータの数と繰り返しの数が一致しないと、出力されません。 いちいちファイルをみるのは面倒なので、なんとか したいのですが
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
読み込みと書き込みをひとつのループに入れておいて、読み込みファイルのEOFを検出したらループを抜けるようにすれば良いのでは?
その他の回答 (4)
- nofutureforyou
- ベストアンサー率9% (25/277)
そういうことは、Fortran でなく、AWK とかでやったほうがいいですよ。
- mac_res
- ベストアンサー率36% (568/1571)
real*8 y open(7,file='test.txt') open(8,file='aftest1.txt') open(9,file='aftest2.txt') do i=1,99999 read(7,*,end=200)n,y if (n .eq. 0) then write(8,*)y else write(9,*)y end if end do 200 close(7) close(8) close(9) end
- ultraCS
- ベストアンサー率44% (3956/8947)
こういうのは、むこうにまとめて書くこと、ソースを書き換えるたびに質問を起こすつもりかい。 というお小言は別として データの数とループの数が違ったって、出力はするはずでしょ、必ずk個になるので足りなかったり、不定だったりすると思うけど。 で、#2の方の答えを見て組み直してください あるいは、どうしても配列にこだわるなら、ループカウントを利用して、その数だけ回しても可能でしょ、ここだと、do j=1,kをdo j=1,i-1だね。 ただ、一個もデータがなかった場合、FORTRAN77あたりだと、1から0でも一回ループが回るんじゃなかったかな(回らないかも)、その場合、添え字y(1)は初期化されていないので、不定のデータが出力されるのでまずいね。 ただ、配列の数に収まらなかったらどうなるかとか考えておくべきなので、配列で処理するのはやめましょう。 ここからは役に立つアドバイス ・最初の要素が整数なので、ちゃんと整数型で読むようにする ・浮動小数点同士の比較をする際には誤差が発生することを常に念頭に置く ・配列の宣言の際に、暗黙の型宣言には従った方がよい(I-Nは整数にする)。これだけで、可読性はかなり向上する。 そういうわけで、nはintegerで宣言すること
- chukenkenkou
- ベストアンサー率43% (833/1926)
データ件数が不定なのだから、入力データを一旦、配列に記録するという発想を変えては? こういった処理の場合、普通は入力のループの中で、出力処理を行います。 命令の流れだけを、簡単に示します。 OPEN 入力ファイル OPEN 出力ファイル1 OPEN 出力ファイル2 100 READ(7,*,end=200) ~ IF ~ WRITE 出力ファイル1 ELSE WRITE 出力ファイル2 END IF GO TO 100 200 CLOSE 入力ファイル CLOSE 出力ファイル1 CLOSE 出力ファイル2
補足
すみません。全然分からなかった上に 宿題の期限が迫っていました。 これからは時間があるのできちんと勉強します。