前提・実現したいこと
fortran で,表の形のデータを読みこんで配列に格納し,処理するプログラムを作っており,
読み取りの際に,行の数は固定で列の数が未知のデータに対応できるようにしたいと思っています。
入力データの表は以下のような感じになっており,(〇は数値)
見出し1 見出し2 見出し3 ・・・・・・・・大体30列前後,未知
〇 〇 〇 ・ ・ ・
〇 〇 〇 ・ ・ ・
〇 〇 〇 ・ ・ ・
・ ・ ・
・ ・ ・
・ ・ ・
約20万行,固定
発生している問題・エラーメッセージ
自分としては,ソースコードのように見出しと数値を別々に読みこんだ上で,
一つ一つの列をまとめて読み込みながら列の方向にdoループを回していき
iostatが負を示した時点を表の終わりと見なすようにしたいと思っていました。
ただそのやり方では,結果を確認しても,並びが全く原型をとどめておらず,うまく読みこめていない様です。
allocateを使う事も考えましたが,readする前に行列の大きさを把握できなければならず,その方法が思いつきませんでした。
他に何か良い方法はないでしょうか。
よろしくお願いします。
(ちなみに,可能であれば行,列ともに未知でも可能な方法があれば,
合わせて教えて頂けると助かります。)
該当のソースコード(抜粋)
fortran
1filename=a(p) 2 open(10, file=trim(filename)) 3 write(*,*), trim(filename) 4 5 l=0 6 do j=1, 100 7 !各項目の見出しの読み込み 8 read(10,*,iostat=ios) (head(i,j), i=1,1) 9 if(ios .lt. 0) exit 10 l=l+1 11 end do 12 write(*,*) l 13 14 15 m=0 16 do j= 1, 100 17 !データの読み込み 18 read(10,*,iostat=ios) (pix(i,j), i=1,size) 19 if(ios .lt. 0) exit 20 m=m+1 21 end do 22 write(*,*) m
該当のソースコード2
fortran
1program test 2 implicit none 3 real, allocatable :: pix(:, :) 4 integer :: nor, noc, nod, ip , i, j 5 character(len = 10), allocatable :: degree(:) 6 character(len = 99) :: buff 7 8 write(*,*) "input the angle you process" 9 read(*,*) buff 10 write(*,*)"length of the input data", len(buff) 11 12 open(10, file= "angle_list.txt") 13 write(10,*) buff 14 15 nod=0 16 ip=0 17 do while (ip < len(buff)) 18 ip = ip + 1 19 if (buff(ip:ip) == ' ') cycle 20 nod = nod + 1 21 do while (buff(ip:ip) /= ' ') 22 ip = ip + 1 23 end do 24 end do 25 26 !roop: do while(ip < len(buff)) 27 ! ip= ip + 1 28 ! if( buff(ip:ip)==" " ) then 29 ! nod= nod + 1 30 ! if( buff(ip+1:ip+1)==" " ) exit roop 31 ! end if 32 !end do roop 33 34 write(*,*)"variety of angle", nod 35 36 allocate(degree(nod)) 37 38 close(10) 39 40 open(10, file= "angle_list.txt") 41 read(10,*) (degree(i),i=1, nod) 42 43 write(*,*) "degree data" 44 do i=1, nod 45 write(*,*) degree(i) 46 end do 47 48 deallocate(degree) 49 50end program
回答1件
あなたの回答
tips
プレビュー