• 締切
  • 困ってます

Fortran;入出力の繰り返し

  • 質問No.1059182
  • 閲覧数2070
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 25% (1/4)

 まだまだFortran初心者なのですがよろしくお願い致します。

 Fortranを用いて数値計算を行っておりまして、読み込ませたいデータが100ほどあるのですが(data1, data2, …, data100、というデータファイルでして、ヘッダーは同じで読み込ませたい数値のみが異なっています。)、1つずつ読み込ませるのはかなり効率悪いので連続して全てを一気に読み込ませるたいのですが、そのためにはどうしたらよいのか悩んでいます。
 同様に結果のファイル(result1, result2, …, result100)も全て自動で書き出したいので、どちらもopen文をdo-continueでくくればよいのかとも思いやってみましたが上手く行きませんでした。(このようにしますとresult100のみしか作成されません)
 
 かなり見当違いのことをやってしまっているのかもしれませんが、周囲にはFortranユーザーはおりませんので、こちらに質問させて頂きました。
 正しいプログラムの書き方やアドバイスなど、ご教授頂ければ幸いです。

回答 (全4件)

  • 回答No.4

ベストアンサー率 48% (4454/9220)

#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
ファイル名を作るところはもうちょっとスマートにやる手段があるかもしれません。
  • 回答No.3

ベストアンサー率 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
  • 回答No.2

ベストアンサー率 48% (4454/9220)

まず、単純変数に読み込むなら繰り返しは使えませんから、配列変数に読み込んだり、配列変数を書き出したりすることになります。
また、入力、出力とも、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を省略することも出来ますけど。
お書きの様子だと、まず入門書を読むことから始めるべきかと思います。
  • 回答No.1

ベストアンサー率 28% (4497/16038)

>データが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があろうが、「一気に読み込ま」せることは出来ない。プログラムコーディグ上も
そういう指令・コマンドなどを設けてないはず。
物理的には、ディスクはセクタ単位とかで、レコードと関係なく、一気に読み込むが、入出力システムが、ユーザーに渡すのは、レコード単位でしか渡さない。
お礼コメント
yoshilin

お礼率 25% (1/4)

 お返事遅くなってしまいまして申し訳ありません。アドバイスどうもありがとうございました。
 「入出力システムはレコード単位でしか渡さない」という点は認識しておりませんでした。自分の勉強不足を露呈する形になってしまいまして恥ずかしく思います。
 質問でも多少触れましたが、data1.dat, data2.dat, ..., data100.datという、ヘッダーのみことなる100個のデータファイル

         ex.   PSI  PHI  DEPTH
            -13.0  -38.6  969.0
                          という形式のファイルです。

をどのようにしたら簡単に読み込ませてかつそれぞれ100個のファイルに書き出すことが出来るのだろう?(これまでは読み込みと書き込みのopen文を毎回変更して100個の結果ファイルを作成していたものですから…)と考えていたのですが、アドバイス頂きましたように1レコードに変更して試してみようと思っております。

 これを機に、今回の内容に関する類がなるべく詳しく書かれてある本を購入してしっかり基礎から勉強します。

 本当にありがとうございました。
投稿日時:2004/10/29 09:19
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

ピックアップ

ページ先頭へ