- 締切済み
Fortran;入出力の繰り返し
まだまだFortran初心者なのですがよろしくお願い致します。 Fortranを用いて数値計算を行っておりまして、読み込ませたいデータが100ほどあるのですが(data1, data2, …, data100、というデータファイルでして、ヘッダーは同じで読み込ませたい数値のみが異なっています。)、1つずつ読み込ませるのはかなり効率悪いので連続して全てを一気に読み込ませるたいのですが、そのためにはどうしたらよいのか悩んでいます。 同様に結果のファイル(result1, result2, …, result100)も全て自動で書き出したいので、どちらもopen文をdo-continueでくくればよいのかとも思いやってみましたが上手く行きませんでした。(このようにしますとresult100のみしか作成されません) かなり見当違いのことをやってしまっているのかもしれませんが、周囲にはFortranユーザーはおりませんので、こちらに質問させて頂きました。 正しいプログラムの書き方やアドバイスなど、ご教授頂ければ幸いです。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
#2です。 #3さんの回答を読んでもう一度質問文を読み直すと、確かに、「データが100個」でなく「データファイルが100個」という意味のように思えてきましたので、さきの#2の回答は的外れでした。 >1つずつ読み込ませるのはかなり効率悪いので連続して全てを一気に読み込ませるたいのですが、 1つずつ処理するプログラムが出来ているのでしたら、それをサブルーチンにして、ファイル名を変えながら呼び出せばいいと思います。 character infile*20, outfile*20 do i=1,100 if(i.lt.10)then write(infile,'A,I1') 'data',i write(outfile,'A,I1') 'result',i else if(i.lt.100) then write(infile,'A,I2') 'data',i write(outfile,'A,I2') 'result',i else write(infile,'A,I3') 'data',i write(outfile,'A,I3') 'result',i end if call dataproc(infile,outfile) end do end ファイル名を作るところはもうちょっとスマートにやる手段があるかもしれません。
- JaritenCat
- ベストアンサー率37% (122/322)
どの言語でもたぶん同じですが、openしたあとは必ずcloseしないといけません。ちゃんと閉じれば繰り返しopenできるはずです。 質問の文面からデータが入っているファイルが100個あるのだと認識しました。 ファイル名を並べたファイルを準備して、違う装置番号でデータファイルを開けば、同時に2個のファイルが扱えます。 こんな感じでしょうか。。fnameというファイルに呼び出したいデータのファイル名を書いておきます。(ここでは3個) program test character str*10 character fname*80 open(10,file='fname') do i=1,3 read(10,*) fname open(11, file=fname) write(*,*) fname do j=1,10 read(11,*) a write(*,*) a end do close(11) end do close(10) stop end ---- fnameの内容 ---- data1 data2 data3 ---- data1~3の内容 ---- 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
- notnot
- ベストアンサー率47% (4900/10358)
まず、単純変数に読み込むなら繰り返しは使えませんから、配列変数に読み込んだり、配列変数を書き出したりすることになります。 また、入力、出力とも、1レコードに100個のデータが並んでいるのか、1レコードに1データで100レコードあるのか?それによって書き方は変わります。 前者なら、read(5,*) (data(i),i=1,100) 後者なら、do 10 i=1,100 10 read(5,*) data(i) あと、openを繰り返しちゃダメです。openの意味をわかっていませんね。これはどの言語でも同じです。fortranの場合はopenを省略することも出来ますけど。 お書きの様子だと、まず入門書を読むことから始めるべきかと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
>データが100ほどあるのですが この意味を(レコードとの関連で)質問者が認識していないのでは。 CSVファイル(判りますか、カンマでデータ項目を区切ったデータ)にデータがあるとして、 (1)12,13,34,2,23・・・ とカンマで区切られた数値が100データある場合。 この場合は1レコードのファイルです。 (2)12(復帰改行)第1レコード 13(復帰改行)第2レコード 34(復帰改行)第3レコード 2(復帰改行) 23(復帰改行) ・・・・ 100個 この場合は100レコードのファイルです。 (1)の場合は n=1 1レコードを読む ファイルの終りになる 読んだ文字をカンマを頼りに各項目を分離 1つ分離するごとに、配列D(n)に保持。 n=n+1 繰り返し (2)の場合は n=1 1(つぎの)レコードを読む 読んだ文字を配列D(n)に保持。 n=n+1 ファイルの終りになるまで次のレコードを読む繰 り返し >1つずつ読み込ませるのはかなり効率悪いので連続して全てを一気に読み込ませるたいのですが (1)の場合は入出力は1回なので議論なし。 (2)の場合は、色々な言語やOSがあろうが、「一気に読み込ま」せることは出来ない。プログラムコーディグ上も そういう指令・コマンドなどを設けてないはず。 物理的には、ディスクはセクタ単位とかで、レコードと関係なく、一気に読み込むが、入出力システムが、ユーザーに渡すのは、レコード単位でしか渡さない。
お礼
お返事遅くなってしまいまして申し訳ありません。アドバイスどうもありがとうございました。 「入出力システムはレコード単位でしか渡さない」という点は認識しておりませんでした。自分の勉強不足を露呈する形になってしまいまして恥ずかしく思います。 質問でも多少触れましたが、data1.dat, data2.dat, ..., data100.datという、ヘッダーのみことなる100個のデータファイル ex. PSI PHI DEPTH -13.0 -38.6 969.0 という形式のファイルです。 をどのようにしたら簡単に読み込ませてかつそれぞれ100個のファイルに書き出すことが出来るのだろう?(これまでは読み込みと書き込みのopen文を毎回変更して100個の結果ファイルを作成していたものですから…)と考えていたのですが、アドバイス頂きましたように1レコードに変更して試してみようと思っております。 これを機に、今回の内容に関する類がなるべく詳しく書かれてある本を購入してしっかり基礎から勉強します。 本当にありがとうございました。