まだまだFortran初心者なのですがよろしくお願い致します。
Fortranを用いて数値計算を行っておりまして、読み込ませたいデータが100ほどあるのですが(data1, data2, …, data100、というデータファイルでして、ヘッダーは同じで読み込ませたい数値のみが異なっています。)、1つずつ読み込ませるのはかなり効率悪いので連続して全てを一気に読み込ませるたいのですが、そのためにはどうしたらよいのか悩んでいます。
同様に結果のファイル(result1, result2, …, result100)も全て自動で書き出したいので、どちらもopen文をdo-continueでくくればよいのかとも思いやってみましたが上手く行きませんでした。(このようにしますとresult100のみしか作成されません)
かなり見当違いのことをやってしまっているのかもしれませんが、周囲にはFortranユーザーはおりませんので、こちらに質問させて頂きました。
正しいプログラムの書き方やアドバイスなど、ご教授頂ければ幸いです。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#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
- 回答日時:
どの言語でもたぶん同じですが、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
- 回答日時:
まず、単純変数に読み込むなら繰り返しは使えませんから、配列変数に読み込んだり、配列変数を書き出したりすることになります。
また、入力、出力とも、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
- 回答日時:
>データが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レコードに変更して試してみようと思っております。
これを機に、今回の内容に関する類がなるべく詳しく書かれてある本を購入してしっかり基礎から勉強します。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコードが存在しなかった場合
-
ADO VBA 実行時エラー3021
-
JSPのNULLレコード表示について...
-
アクセスでレポートの1印刷内...
-
ヘッダレコードとトレーラレコ...
-
差し込み印刷のレコード数について
-
DataGridViewの、選択されてい...
-
サブレンジ分割されたNDB(富士...
-
ファイル書込みで一行もしくは...
-
Access でレコードセレクタが押...
-
ワードの差込印刷で教えて下さ...
-
カレントレコードが無い事を判...
-
DataGridViewにてセル以外をク...
-
データセットのレコード更新が...
-
ACCESSで「16389予約済みエラー...
-
【ExcelVBA】Powerクエリーでい...
-
VBAで制御コード付きテキストフ...
-
ACCESS2000 SQL 最大レコード数
-
AccessVBAのMoveメソッドにつき...
-
Line Inputで文字化け(助けて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ADO VBA 実行時エラー3021
-
ファイル書込みで一行もしくは...
-
JSPのNULLレコード表示について...
-
レコードが存在しなかった場合
-
DataGridViewの、選択されてい...
-
カレントレコードが無い事を判...
-
DataGridViewの内容をDBに反映...
-
Access を×ボタンで閉じ...
-
アクセスでレポートの1印刷内...
-
ヘッダレコードとトレーラレコ...
-
Access でレコードセレクタが押...
-
レコードセット(ADO.Recordset)...
-
ACCESSで大量の更新を行うと「...
-
差し込み印刷のレコード数について
-
DataGridViewにてセル以外をク...
-
サブレンジ分割されたNDB(富士...
-
Line Inputで文字化け(助けて...
-
固有レコード識別子の選択とは
-
[VBA] ADOの Clone と AddNew
-
ワードの差込印刷で教えて下さ...
おすすめ情報