みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

と書いたのですがデータの数と繰り返しの数が一致しないと、出力されません。
いちいちファイルをみるのは面倒なので、なんとか
したいのですが

投稿日時 - 2006-01-27 00:26:47

QNo.1923831

暇なときに回答ください

質問者が選んだベストアンサー

読み込みと書き込みをひとつのループに入れておいて、読み込みファイルのEOFを検出したらループを抜けるようにすれば良いのでは?

投稿日時 - 2006-01-27 00:41:44

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

そういうことは、Fortran でなく、AWK とかでやったほうがいいですよ。

投稿日時 - 2006-01-27 22:58:26

ANo.4

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

投稿日時 - 2006-01-27 16:44:22

ANo.3

こういうのは、むこうにまとめて書くこと、ソースを書き換えるたびに質問を起こすつもりかい。
というお小言は別として

データの数とループの数が違ったって、出力はするはずでしょ、必ずk個になるので足りなかったり、不定だったりすると思うけど。
で、#2の方の答えを見て組み直してください

あるいは、どうしても配列にこだわるなら、ループカウントを利用して、その数だけ回しても可能でしょ、ここだと、do j=1,kをdo j=1,i-1だね。
ただ、一個もデータがなかった場合、FORTRAN77あたりだと、1から0でも一回ループが回るんじゃなかったかな(回らないかも)、その場合、添え字y(1)は初期化されていないので、不定のデータが出力されるのでまずいね。

ただ、配列の数に収まらなかったらどうなるかとか考えておくべきなので、配列で処理するのはやめましょう。

ここからは役に立つアドバイス
・最初の要素が整数なので、ちゃんと整数型で読むようにする
・浮動小数点同士の比較をする際には誤差が発生することを常に念頭に置く
・配列の宣言の際に、暗黙の型宣言には従った方がよい(I-Nは整数にする)。これだけで、可読性はかなり向上する。

そういうわけで、nはintegerで宣言すること

投稿日時 - 2006-01-27 16:37:07

補足

すみません。全然分からなかった上に
宿題の期限が迫っていました。
これからは時間があるのできちんと勉強します。

投稿日時 - 2006-01-28 00:03:00

ANo.2

データ件数が不定なのだから、入力データを一旦、配列に記録するという発想を変えては?

こういった処理の場合、普通は入力のループの中で、出力処理を行います。
命令の流れだけを、簡単に示します。

  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

投稿日時 - 2006-01-27 01:53:01

あなたにオススメの質問