Fortran90初心者です。
実験でたとえば
時刻 温度 流速
t1 T1 v1 (CR/LF)
... ... ...
tn Tn vn (CR/LF)
のような ascii data file (FILE.dat)を得ています。
実験ごとに n の値、つまり、行数が違っており、このファイル内のデータを
次のようなFortran.90のプログラムで読み取って、その後処理を行っています。
integer :: Nl ! number of lines
integer :: i
character(180) :: dummy_line ! for void reading
real(8), allocatable :: time(:), temp(:), velocity(:)
open (5,file='FILE.dat', status='unknown',form='formatted')
Nl = 0
do
read(5,*, end = 99) dummy_line ! void read is absurd !!
Nl = Nl + 1
end do
99 write(*,*)"eof encountered at Nl = ", Nl ! total lines in the file
allocate(time(Nl), temp(Nl), velocity(Nl)) ! allocation of variables
rewind(5) ! read pointer is set to the beginning of the file
do i=1, Nl
read(5,*) time(i), temp(i), velocity(i)
end do
この方法だと、元のファイルを2度読み込むことになりますので、あまり
賢い方法ではないと怒られています。実験データを出力する機器の方でファイルの
先頭にデータ数 n を吐き出させることもできません。
Fortran90だけでデータを読みながら動的配列を増やしてゆく方法があったら
ご教示のほどお願いします。
Cならリスト処理やreallocで可能かとも思いますし、Linux上なら wc -lと
Cのpopenとでも可能かとは思うのですが、プラットフォームはwindows7
で、intel fortranを使用しています。
(最終手段は入力部はCで、処理部はFortranで、linkするのでしょうか。)
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
read(5,*, end = 99) dummy_line ! void read is absurd !!
だとデータを読み込むことになりますが
read(5,'()')であればその行をスキップすることになるので
幾分早くなるかとは思いますがいかがでしょうか?
要はこんな↓感じ
Integer :: NI, stat
NI = 0
DO
READ(5,'()',IOSTAT = stat)
IF(stat == 0) THEN
NI = NI + 1
ELSE IF(stat < 0) THEN
EXIT
END IF
END DO
REWIND(5)
回答ありがとうございました。
なるほど空読みするにしてもスキップしながら行数を数えるのですね。
形式上2度読み込むにしても、1回目は実質読んではいないので少し効率は
良くなりますね。
当初期待していたCのリスト処理に対応するものとはイメージが異なりますが、
処理が速くなるので怒られなくてすみそうです。
ありがとうございました。
No.2
- 回答日時:
C の realloc 相当のことを自力でやればいいんだろうけど....
あえて「Fortran を使わない」というオプションはなし?
回答ありがとうございました。
はい、読み込むところをCで読み込ませて、動的配列をlist処理で格好よく確保する
部分(関数)をつくり、確保した配列をFortran90のサブルーチンに渡すことは
考えられますが、先生がFortran90/95にこだわるので…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- 英語 lead on Earth,” の意味の取り方 6 2022/12/06 10:52
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
相手側の携帯が電源切れてる時...
-
LINE追加で「該当するユーザー...
-
1コールだけ鳴るけど切れる電話...
-
よく05(04)lineって見かけるん...
-
いきなりラインのトークに「新...
-
face book で女性の方からline ...
-
Windowsのバッチファイルで正規...
-
ラインナップとラインアップは...
-
「一番上、真ん中、下」を示す英語
-
タイトルの改行
-
ある男子から、ライン追加され...
-
新規発行された格安SIMでLine登...
-
生産ラインの品質を表す直行率...
-
遠くにいる友達とLINE交換する...
-
教えてください
-
歯科衛生士の方へ、連絡先を渡...
-
lineのワン切り、なぜ?
-
既婚女性にラインを聞くことに...
-
妊娠したらどうする?聞くのは...
-
質問です。 先日クラスの女子に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
1コールだけ鳴るけど切れる電話...
-
相手側の携帯が電源切れてる時...
-
よく05(04)lineって見かけるん...
-
LINE追加で「該当するユーザー...
-
ラインナップとラインアップは...
-
Windowsのバッチファイルで正規...
-
いきなりラインのトークに「新...
-
face book で女性の方からline ...
-
生産ラインの品質を表す直行率...
-
遠くにいる友達とLINE交換する...
-
「一番上、真ん中、下」を示す英語
-
python flask から fastapiへの...
-
法線(normal line)はなぜそう...
-
ある男子から、ライン追加され...
-
LINEで好きな人が「笑」を全然つ...
-
タイトルの改行
-
スマホに外国の電話番号を登録...
-
ネットで個人の電話番号を調べ...
-
lineのワン切り、なぜ?
-
会社の先輩とLINE プライベート...
おすすめ情報