FORTRAN(ファイル読み込み)


アニメ『ROBOMASTERS THE ANIMATED SERIES』

メガネ率高いです。

さてFORTRANです。
前回「FORTRAN(ファイル書き込み)」でファイルへデータを書き込みしましたが、次はこのファイルを読み込みしてみます。
catで見るとこのようなデータになっています。

takk@deb9:~$ cat sample.txt
         110         220         330
takk@deb9:~$

読み込みのプログラムは書き込みプログラムをWRITEからREADに変えればよいです。その際、OPENのSTATUSはOLDにします。OLDという表現が妥当かどうか分かりませんが、既存ファイルの意味です。

takk@deb9:~$ cat read-file.f
      PROGRAM MAIN
      OPEN(UNIT=10,FILE='sample.txt',STATUS='OLD',
     1ACCESS='SEQUENTIAL')
      READ (10,*) I,J,K
      WRITE(*,22222) I,J,K
      CLOSE(10,STATUS='KEEP')
11111 FORMAT(I5)
22222 FORMAT('I =',I5,',J=',I5,',K=',I5)
      STOP
      END
takk@deb9:~$ 

実行すると各変数に各データが格納されていることが分かります。

takk@deb9:~$ gfortran read-file.f
takk@deb9:~$ ./a.out
I =  110,J=  220,K=  330
takk@deb9:~$

読み込みファイルのフォーマットは、どうやら空白がデータの区切り文字となっているようですが、空白の数はいくつでもよいのでしょうか。まずは一つから。

takk@deb9:~$ cat sample.txt
110 220 330
takk@deb9:~$ ./a.out
I =  110,J=  220,K=  330
takk@deb9:~$

空白一つでも問題ないようです。

100個ぐらいの空白を入れて確認してみましょう。

takk@deb9:~$ perl -e '$s=" " x 100;print"110${s}220${s}330\n"' > sample.txt
takk@deb9:~$ wc -L sample.txt
209 sample.txt
takk@deb9:~$

空白100 * 2 + 3文字 * 3 = 209なので、サイズは一致しますね。
実行してみます。

takk@deb9:~$ ./a.out
I =  110,J=  220,K=  330
takk@deb9:~$

問題なく読み込みできました。

読み込む時に指定する書式が間違っているとどうなるのでしょうか。

takk@deb9:~$ cat read-file-f.f
      PROGRAM MAIN
      OPEN(UNIT=10,FILE='sample.txt',STATUS='OLD',
     1ACCESS='SEQUENTIAL')
      READ (10,11111) I,J,K
      WRITE(*,22222) I,J,K
      CLOSE(10,STATUS='KEEP')
11111 FORMAT(3I5)
22222 FORMAT('I =',I5,',J=',I5,',K=',I5)
      STOP
      END
takk@deb9:~$ gfortran read-file-f.f
takk@deb9:~$ cat sample.txt
110 220 330
takk@deb9:~$ ./a.out
I = 1102,J= 2033,K=    0

空白を無視して読み込まれました。なかなか強引ですね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA