バイナリファイルをFortranで読み出すためには、テキストに比べて少し複雑なことをすることになる。
PROGRAM samp IMPLICIT NONE INTEGER i,j,k,siz REAL,DIMENSION(1:5,1:5,1:2) :: temp siz=5*5*2*4 OPEN(300,FILE="hoge.bin",ACCESS="direct",FORM="unformatted",STATUS="OLD",recl=siz) READ(300,rec=1) (((temp(i,j,k),i=1,5),j=1,5),k=1,2) CLOSE(300) OPEN(310,FILE='hogeout.txt',STATUS="REPLACE") WRITE(310,*) (((temp(i,j,k),i=1,5),j=1,5),k=1,2) CLOSE(310) STOP END PROGRAM samp
OPEN文で、ACESS="direct"つまり直接探査をします。
何も書かなければACCESS="sequential"つまり順番探査になる。
OPEN文やREAD文の中では、数値演算は行えないので、前もってsiz=5*5*2*4と書く。ここで*4かどうかはコンパイラに依存する。
READ文でデータ数が1つなら、rec=1と書く。
hogeout.txtに出力している。
バイナリファイルで出力するためには、入力と逆の方法をする。これでGrADSで読める。
もっとも(x,y,z)のデータなら、GMTでgrdファイルを作った方が簡単。
PROGRAM samp IMPLICIT NONE INTEGER i,j,k,siz REAL,DIMENSION(1:5,1:5,1:2) :: temp siz=5*5*2*4 temp(:,:,:)=0.0 OPEN(300,FILE="hoge.bin",ACCESS="direct",FORM="unformatted",STATUS="REPLACE",recl=siz) WRITE(300,rec=1) (((temp(i,j,k),i=1,5),j=1,5),k=1,2) CLOSE(300) STOP END PROGRAM samp
このプログラムで作成したバイナリファイルを、上のプログラムで読み込むことができる。
バイナリの入力では、変数の型を適切に指定する必要がある。
もし、バイナリの中身が整数なのに、DOUBLE PRECSIONのように指定してしまうと
forrtl: severe (67): input statement requires too much data, unit ...
のように怒られる。
rec(レコード)数が2以上、つまり変数が2つ以上ある場合には、以下のような書き方をする。