2008年10月15日水曜日

readのIOSTAT

パソコンが不調だ。ガリガリ言う。起動時が最もひどく、しばらく動かしてると安定⇒思い出したようにガリガリガリクソン。卒論・修論・その他もろもろをこいつで作ったのでそれがそろそろ終了っぽいのはなんか寂しい。MinGWつんだりまた一からかーメンドクサ。まぁ今はなんとか動いているけどイラストレーター起動に5分ぐらいとか処理速度が遅いのも問題だしガリガリ音は精神衛生上よろしくないので買い替えないといけない。無いとは思うけど動かしっぱなしで火を噴かれたりとかいやなもんでなるべく使わないようにしているこの数日。ネット巡回とかしない分、早寝だし本読むしたまにはパソコン使わない方がいいのかも。

ところで、Fortran90のread文には3番目にIOSTATという引数があるのを知った。readでなんのエラーもなくファイルを読み込んでいるときはIOSTAT=0で、EOF検出ではIOSTAT=-1になる。まぁほかにも色々あるっぽいが。なので、何個データあるかわからんファイルから読み込んで処理するときには、IOSTATで条件分岐させるのが便利ぽ。ただしFortranは可変長配列をサポートしてないというアレな言語なので(それさえクリアすれば数値計算もっと楽になると思われ、Fortran2003では対応してるとかの噂。Fortran2003はオブジェクト指向もできるとかなんか凄く拡張されてるしSunもNAGもコンパイラ作ったみたいだしつかってみたいやも)90の段階ではいったん行数をカウントして、割付して・・・とかちょっと回りくどくやらなあかんぽいけど。以下つくってみたのでサンプル。data.txtから数値データ読み込んでフォーマットしてformatted.txtに書き込む。

program main
!program for setting the data file formatted form
implicit none
integer ::Ncount,i,j,ISTS
real(8) :: temp
real(8),allocatable :: a(:)
open(11,file="data.txt")
Ncount=1
do while(.true.)
read (11,*,IOSTAT=ISTS) temp
print*,temp
if (ISTS /= 0) then
print*,"IOSTAT=",ISTS
exit
end if
Ncount=Ncount+1
end do
close(11)
print*,"Number of low+1=",Ncount
allocate(a(Ncount-1))
a=0.0d0
open (12,file="data.txt")
do i=1,Ncount-1
read (12,*) a(i)
end do
close (12)
open(13,file="formatted.txt")
do j=1,i-1
write(13,'(E22.14)') a(j)
end do
close (13)
end program

0 コメント: