- ベストアンサー
FORTRANのプログラム
今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? program dat real x(10), y(10) open(7,file='test.txt') do i=1,10 read(7,*,end=200) x(i),y(i) end do do j=1,10 if(x(j).eq.0.0) then open(8,file='aftest1.txt') write(8,*) y(j) else open(9,file='aftest2.txt') write(9,*) y(j) end do close(8) close(9) 200 close(7) end
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ホストのOSだったらGrepありませんからねえ、ORTRANで考えましょ。 Fortranに限らず、このプログラムはテキストフィルタとして動作しますから一枚読んでは書くという風にプログラムします。 ソースは書きません ・読み込み、書き込みファイルをオープン ・一枚読む、EOFなら終了処理 ・-1か0か判定 ・-1ならFile:8に、0ならFile:9に書き込む ・読み込みに戻る ・終了処理、ファイルをリワインド(笑)してクローズ ところで、同じ動作をするプログラムを色々な言語で書いてみるのは愚問ではありません、力を付ける重要な方法です。FORTRANでも、有能なプログラマなら、Cで出来る程度のテキスト処理は全て出来ます。言語処理系やOSを書くことも出来ます。 #2の方の考え方だと、"Hello World"は、Echo Hello Worldで済むことになってしまいますね。
その他の回答 (2)
- ekuko_ecch
- ベストアンサー率17% (16/91)
行頭に-1を含む行と行頭に0を含む行を分離したいのであれば、テキスト処理をするのが常識です。 grep "^-1" データファイル とすれば、-1で始まる行を抽出できます。また、 grep "^0" データファイル とすれば、0で始まる行を抽出できます。 これらをリダイレクトすれば、ファイルに落すことができます。 FORTRANでプログラムを作るのが目的であれば、その課題は愚問です。 ※ FORTRANは、テキスト処理を目的としていない。
- kernel_kazzz
- ベストアンサー率29% (895/2993)
fortranやってたのがもう25年前なので自信が無いのですが。 write前に毎回openしてたら、毎回上書きされませんでしたっけ? どちらも最後の1件だけが残るような… 今、outputされたデータはどうなっていますか?
補足
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 と書けばコンパイルエラーも実行もできるのですが 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 の例だと3回のみ繰り返せればできるのですが 4とか5にすると全く結果がでません。 (ちなみに実験データの数はテキストによって 異なります。)