2017-03-01 7 views
0

データの開発者がFortranで書かれたプログラムを提供するバイナリファイルを開く必要があります。私はFortran言語が新しくなっていますが、Rで新しいプログラムを書くのではなく、準備プログラムを使用することを試してみる価値があると思います。データファイルで提供されたFortranコードを実行するとエラーが表示されます

開いているファイルはthis,です。データを開くコード行はhereです。データには開始時に576バイトのヘッダー行が含まれ、thisを使用して開くことができます。

私がしたこと: 新しいフォルダにバイナリファイルを保存しました。このフォルダには、それを開くソフトウェアのコードも保存されています。 GNU-Linuxの端末から、後者のフォルダ(cd /home/urs/../)に、端末を設定した後、私は実行します。

# compile the program using gfortran 
    gfortran read_v2.2_month.f -o read_v2.2_month 
# make file executable 
chmod +x read_v2.2_month 
# run the program 
./read_v2.2_month 

しかし、私は次のエラーを取得する:

Error: read error  5016 on file gpcp_v2.2_psg.1987 

EDIT: のFortranのコードヘッダーの最初の行を除くデータを開くには、次のようになります。

 OPEN (UNIT=10, FILE='gpcp_v2.2_psg.1987', ACCESS='DIRECT', 
    +   FORM='UNFORMATTED', STATUS='OLD', RECL=144, 
    +  IOSTAT=iret) 
     IF (iret .NE. 0) THEN 
      WRITE (*, *) 'Error: open error', iret, 
    +     ' on file gpcp_v2.2_psg.1987' 
      STOP 
     END IF 
C 
C  Compute the number of records to skip, namely 1 for the header 
C  and 72 for each intervening month. 
C 
     nskip = 1 + (month - 1) * 72 
C 
C  Read the 72 rows of data and close the file. 
C 
     DO 10 j = 1, 72 
      READ (UNIT=10, REC=j+nskip, IOSTAT=iret) 
    +   (data (i, j), i = 1, 144) 
      IF (iret .NE. 0) THEN 
       WRITE (*, *) 'Error: read error', iret, 
    +      ' on file gpcp_v2.2_psg.1987' 
       STOP 
      END IF 
    10 END DO 
     CLOSE (UNIT=10) 
C 
C  Now array "data" is ready to be manipulated, printed, etc. 
C  For example, dump the single month as unformatted direct: 
C 
     OPEN (UNIT=10, FILE='junk', ACCESS='DIRECT', 
    +   FORM='UNFORMATTED', RECL=144, IOSTAT=iret) 
     IF (iret .NE. 0) THEN 
      WRITE (*, *) 'Error: open error', iret, 
    +     ' on file junk' 
      STOP 
     END IF 
     DO 20 j = 1, 72 
      WRITE (UNIT=10, REC=j, IOSTAT=iret) 
    +   (data (i, j), i = 1, 144) 
      IF (iret .NE. 0) THEN 
       WRITE (*, *) 'Error: write error', iret, 
    +      ' on file junk' 
       STOP 
      END IF 
    20 END DO 
     CLOSE (UNIT=10) 
     STOP 
     END 
+2

の複製です。コードを見る必要があると思います。 –

+0

私はあなたのリンクに従っていません。ここに最小限の再現コードを投稿してください。 – Ross

+0

BTWエラー5016は '5016 LIBERROR_SHORT_RECORD'です –

答えて

1

このコードで間違っていることがいくつかあります。 exapleの場合、RECLはgfortranでバイト数でカウントされますが、コードは4バイトのワードを仮定しています(Intelのように)。 RECL値は明示的に示されてはならない。

RECLを4 * 144に増やしてください。助けがあれば、この質問はReading writing fortran direct access unformatted files with different compilers

関連する問題