• 締切済み

fortranの配列のreadについて

fortran初心者です。 研究のデータ整理を行う際に 240*21のテキストデータを読み込む必要があるのですが、 自分なりに勉強してみたのですが、fortranの計算がずっとカーソルが点滅しており いつまで経っても終わらない状態のため、 ファイルopenまではいくのですが、その中身を読み込めてないようです。 プログラムですが自分としては次のように考えました。 REAL temp DIMENSION temp(21,240) DATA temp/5040*0.00/    open(11,status='unknown',file=filename)    read *,((temp(q,p),p=1,240),q=1,21)    close(11) と配列を組んで考えてみたのですが…ダメでした。 おかしなところがありましたら教えてください。 よろしくお願いします。 対象のテキストデータです。 0 32.57 32.48 32.48 32.57 32.66 32.75 32.75 32.75 33.01 33.10 32.93 32.48 32.21 32.21 32.30 32.21 32.21 32.12 32.12 32.21 1 32.57 32.57 32.48 32.48 32.57 32.66 32.66 32.75 32.93 33.01 32.84 32.39 32.21 32.21 32.21 32.21 32.12 32.12 32.21 32.21 2 32.66 32.66 32.66 32.66 32.75 32.84 32.84 32.84 32.93 33.10 32.93 32.48 32.21 32.21 32.12 32.12 32.12 32.12 32.12 32.21 … 239 37.53 37.28 36.76 36.16 35.64 35.21 34.86 34.51 34.16 33.90 33.54 33.37 33.28 33.10 32.93 32.75 32.57 32.39 32.30 32.21 よろしくお願いします。

みんなの回答

  • karupyon
  • ベストアンサー率80% (4/5)
回答No.3

現在のread文の記述方法ですと意図されているファイルからの読み込み動作はしません。 read文の変更が必要です。 read *, ...... と書きますと標準入力(キーボード)からの入力を意味することになります。 ですのでカーソルが点滅してずーと待ち状態になってしまうという事になります。 以下のように変更されてみていただくとおそらく上手く行くかと思います。 read *,((temp(q,p),p=1,240),q=1,21) を read (11,*) ((temp(q,p),p=1,240),q=1,21) に変更。 これによってOpen文でオープンしたファイルから読み込みが行われるようになります。 open(11....) read (11,*) .... close(11) というように装置番号(ここでは11)は対応していなければなりません。 ご参考になればと思います。

参考URL:
http://www.nag-j.co.jp/fortran/FI_15.html
  • f272
  • ベストアンサー率46% (7998/17098)
回答No.2

#1です。 言ったことの意味がまったく理解されていないようです。 「read *,((temp(q,p),p=1,240),q=1,21)」でも「read *,(temp(q),q=1,5040)」でもいいけど,これは標準入力から読む文だということ。 その前に「open(11,status='unknown',file=filename)」とopenした11番のファイルとは何の関係もありません。

  • f272
  • ベストアンサー率46% (7998/17098)
回答No.1

このread文は,どのファイルから読むつもりなの? ついでに p,qは整数型にしてる? DO並びのまわし方と,データの並び方の関係はこれで良いの?

nextco0303
質問者

補足

回答ありがとうございます。 ご指摘を受けて直しておりました。 また、質問をする際に書き忘れておりました。 integer p,qは整数型にしています。 readするfileはtest.txtという名前で filenameのところに記載しておりました。 配列が1次元であれば大丈夫なのでしょうか。 DOの並びがおかしいと思い、 DIMENSION temp(5040) read *,(temp(q),q=1,5040)に 上の文を変えてみてもダメでした。 データの並びはこの順番で並んでいます。"_" はスペースです。 0_32.57_32.48_32.48_32.57_32.66_32.75_32.75_32.75_33.01_33.10_32.93_32.48_32.21_32.21_32.30_32.21_32.21_32.12_32.12_32.21 1_32.57_32.57_32.48_32.48_32.57_32.66_32.66_32.75_32.93_33.01_32.84_32.39_32.21_32.21_32.21_32.21_32.12_32.12_32.21_32.21 データが多いため配列を使いたいと思っています。 何か良い案ございませんでしょうか。 よろしくお願いします。

関連するQ&A

  • Fortranの'read'のVBへの書き換え方

    Fortranのread/writeをVBへの書き換え方を教えて下さい。 他の方の作られたfortran.90のprogramをvisual basicに書きなおす作業をしています。その中の下記のfileのaccessが上手出来ません。このなかに有るbinary,とかbig_endianが原因のようです。 (これの無いfile accessの箇所は問題なく出来ました。) program内でdataをfileに書込み保存して蓄積しているようで、後日このdataをreadして使うようになっていますので新しくfileを作り直すわけにもいきません。 いろいろとcodeを入れてみたが、結果は文字化けばかりで10日も費してしまいました。 binary,bigendianなどの理屈が判っていないのでどうしょうもないと感じました。 どうか下記のfortranをVisual Basicへの書き変え方をご教授お願いします。 REAL ShipDim(17) '読み込みの時   filename = 'c:\pbcal\pbcal\pushdata\'//'push04' open (3,file= filename, status='old', & & form='BINARY', convert='BIG_ENDIAN',err=930) DO 10 J= 1,17 read(3) shipDim(j) 10 CONTINUE      (中略)  '見やすいように簡略化しています。 CLOSE (3,STATUS='KEEP')   '書込みの時はopenは下記で、後readをwriteに変えただけです。 open (3,file= filename, status=pstatus,form='BINARY', convert='BIG_ENDIAN',err=940) VBでTRYしたことの一例     Dim dat() As Byte = New Byte(-1) {}   Dim sr As System.IO.Stream = Nothing   Dim br As System.IO.BinaryReader = Nothing Dim strf As String = filepath & "push04" 'filepathは適当にしている    sr = System.IO.File.Open(strf, _        System.IO.FileMode.Open, System.IO.FileAccess.Read) br = New System.IO.BinaryReader(sr) ReDim dat(sr.Length - 1) dat = br.ReadBytes(sr.Length)      dat に=572個の2-3桁の数字が入っています。encodingなどでためしてみたが文字化け     ばかりです。    (System.Text.Encoding.GetEncoding("****").GetString(dat) など)         どうかよろしくお願いします。

  • fortran77で複数のファイルの読み込み

    fortran77で複数のファイルの読み込み 現在fortran77のプログラムを勉強しております。 ファイルが複数あり、すべてのファイルを読み込みたいのですが、ファイルの数がたくさんあるため、プログラムの行数が多くなってしまいます。 do ループで次々とファイルを開くプログラムを考えているのですが、思いつきません。 どなたか考え方でもいいので、教えてください。 ちなみに私が考えたプログラムは、 open(10,file='C:\FORTRAN\100.txt',status='old') open(11,file='C:\FORTRAN\121.txt',status='old') open(12,file='C:\FORTRAN\144.txt',status='old') open(13,file='C:\FORTRAN\169.txt',status='old') open(14,file='C:\FORTRAN\196.txt',status='old') open(15,file='C:\FORTRAN\225.txt',status='old') ・・・。 これを do ループで次々に開くことを考えると、 character*3 A(10) do 100 i=1,10 A=i*i open(i,file='C:\FORTRAN\A.txt',status='old') 100 continue ・・・ みたいな感じです。 ' 'の中の一部だけを変えたい場合のcharacter 文の使い方がいまいちよく分かりません。

  • Fortranの出力の改行について

    Fortran超初心者です。 test1.csvのファイルには、x,yの変数がずっと続いています。 test2.datのファイルには、a,bの変数がずっと続いています。 この2つのファイルの変数を元に、d,eの値を求め、それをtest3.csvというファイルに出力したいのです。 test1.csvとtest2.datの計算はできていたのですが、test3.csvの出力は最後の計算結果のみしか出力されていません。 多分毎回出力はしているのですが、計算を繰り返すと上書きされ消えてしまうという仕組みになっているのだと思います。 どうやったら上書きされずに、csvファイルの次の行に次のデータを入力できますか? 以下私が考えたFortran90のプログラムです。 open (10, file='test1.csv', status='old')  do   read (10, *, iostat=ios) x, y   open (11, file='test2.dat', status='old')   do    read (11, *, iostat=jos) a, b    d = x +a    e = y + b    if (jos .lt. 0) exit   enddo   open (12, file='test3.csv', status='replace')   write (12, *) x, y, a, b, d, e   close (12)   close (11)   if (ios .lt. 0) exit  enddo close (10) 本当に始めたばかりで、いまいち意味の分かっていない部分もあるのですが、問題点を指摘してくれたら助かります。 わかりにくいので、具体的に少し書くと、 test1.csvには 1,2 9,3 6,4 とデータが続くとします。 test2.datには 80,50 10,20 90,60 とデータが続くとします。 test3.datには 1,2,80,50,81,52 1,2,10,20,11,22 1,2,90,60,91,62 9,3,80,50,89,53 9,3,10,20,19,23 9,3,90,20,99,23 6,4,80,60,86,64 6,4,10,20,16,24 6,4,90,20,96,24 と出力されるようにしたいのです。 実際のデータや変数名も違いますが、プログラムの構造は同じです。 よろしくおねがいします。

  • Fortran90で可変長ファイルを読む

    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するのでしょうか。) よろしくお願いします。

  • fortran90

    fortran90 現在 fortran90 で計算プログラムを作っております。 プログラムはかけたのですが、実行画面にエラーが出ます。 解決方法が分かりません。どなたか分かる方いらっしゃいますか。 プログラム implicit real*8 (a-h,o-z) parameter(n=900) open (1,file='004.txt',status='old') do 10 i=1,n read (1,*,end=11)xx,yy,zz,ww theta=acos(zz) phi1=acos(xx/sqrt(1-zz*zz)) phi2=asin(yy/sqrt(1-zz*zz)) write(*,*)theta,phi1,phi2 10 continue 11 end プログラム内容 あるフォルダーに保存してあるテキストファイルから4×4行列のデータを読み込み、そのデータからθの値とφ1、φ2のアタを求めるプログラムです。 実行分のエラー画面には、 acos: DOMAIN error です。

  • fortran g95を使ってBMPを処理したい

    以前XP環境でVisual Fortran(VF)を使ってBMPファイルを読み込むプログラム使っていました. PCがWin7になった為,FreeのFortran g95を使用して同様の処理を行いたいのですが,上手くできません.例えば”test.bmp”と言う8bitのファイルを読み込みたいとしたとき, VFでは character*1078 temp integer*1 data open(10,file='test.bmp',form='binary') read(10)temp read(10)data このときwrite(*,*)dataは133とします. g95では"binary"が使用できず, character*1078 temp chracter*1 data open(10,file='test.bmp',form='formatted') read(10,*)temp read(10,*)data data2=ichar(data) write(*,*)data2は32となってしまいます. 画像の輝度は133で,VFで読み込んだ値となります. 上のプログラムで何を直せば g95でも正しい輝度情報を読めるのでしょうか? どうぞ宜しくお願いします.

  • 2次元配列の扱い

    2次元配列のようなものについてどなたかご教授ください。 たとえば 1,2,3,4 a,b,c,d という2行のテキストデータを読み込んで (["1","2","3","4"], ["a","b","c","d"]) のようようなリストにはできたみたいなんですが それをまたもとのカンマ区切りテキストにできなくて困ってます。 どこが間違ってるのでしょうか。よろしくお願いします。 open(READ,$filename) || &error("Read Error"); @BASE = <READ>; close(READ); @itemlist=(); foreach $num (0 .. $#BASE) { $BASE[$num] =~ s/\n//g; (@item) = split(/\,/,$BASE[$num]); @itemlist = (@itemlist,[@item]); } ####### $dummy=""; foreach $num (0 .. $#itemlist) { $renketu=join(",",$itemlist[$num]) ."\n"; $dummy.=$renketu; } open(WRITE,">$filename"); flock(WRITE,2); print WRITE $dummy; close(WRITE);

    • ベストアンサー
    • Perl
  • fortranについての質問です。

    fortranについての質問です。 このFortranは、頭にそれぞれ14161~14163とつく33個のファイル(1/1~12/31,欠損地あり1年分)を読んでいき、例えば1/1、1/2…と365日分の33年の平均値を導くはずなのですが、下のようなエラーがでます。おそらく、14161が2008までないからではないかと思うのですが、現在勉強中なので、なにかアドバイス、おかしいところ修正できるところがありましたらお願いします。 program sapporo_kikouchi    INTEGER :: sum, no, point INTEGER :: year, mon, day, data INTEGER :: doy REAL,dimension(365) :: temp, ndata REAL :: lon, lat CHARACTER*4 yyyy CHARACTER*5 sssss ndata(:)=0.0 temp(:)=0.0 do ispot=14161,14163 write(sssss,"(i5)") ispot do iwork=1976, 2008 write(yyyy,"(i4.4)") iwork open(50, file=''//sssss//'_temp'//yyyy//'.csv', status='old') ! write(6,*) ispot iwork    do i = 1,366 read(50,*,iostat=io) id,year,mon,day,lon,lat,data if(io < 0) exit if(mon==2 .AND. day==29) then cycle endif call date2doy(year,mon,day,doy) temp(doy) = temp(doy) + data/10.0 ndata(doy) = ndata(doy) + 1 end do close(50) enddo !!! end of year loop enddo do i=1,365 if( ndata(i) == 0 ) then temp(i) = -99999.9 else temp(i)=temp(i)/ndata(i) endif write(6,*) i, temp(i), ndata(i) enddo stop end program subroutine date2doy(iy,im,id,idoy) INTEGER,dimension(12) :: nday INTEGER :: uruu !!uruu=1: うるう年、uruu=0: 通常の年 uruu=0 DATA nday /31,28,31,30,31,30,31,31,30,31,30,31/ if(mod(iy,4)==0 .AND. mod(iy,100)/=0) then uruu=1 endif if(mod(iy,1000)==0) then uruu=1 endif !! うるう年も無視する itotal = 0 if( im /= 1 )then do m=1, im-1 itotal = itotal + nday(m) enddo endif idoy = id + itotal ! write(6,*) iy,im,id, idoy return end ------------------------------------------------------------------------------ At line 18 of file kikouchi.f90 file: "14161_temp1993.csv" Traceback: not available, compile with -ftrace=frame or -ftrace=full Fortran runtime error: 指定されたファイルが見つかりません。 -------------------------------------------------------------------------------

  • Fortran90/Fortran95→Fortran77

    大学の授業でFortranを使ったプログラミングを勉強しています。 以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます) 大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^; 家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい) Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです 前置きが長くなりましたが、エラーが出る文は以下のところです open(8,file='freq_ex13.dat',action='write',status='replace') ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

  • fortranのopen文について。

    fortranのopen文のファイル名を指定するするとき、doループで名前を変えたいのですが、どのようにやればよいでしょうか? 具体的には、 do i=1,2 open(unit=10+i,file='file.dat',status='replace') とした時、unitと共にファイル名も'file1.dat'、'file2.dat'と変わるようにしたいのです。 よろしくお願いします。

専門家に質問してみよう