执行随数据文件提供的Fortran代码时读取错误

时间:2017-03-01 13:41:48

标签: binary fortran

我需要打开一个二进制文件,数据开发人员为其提供用Fortran编写的程序。我是Fortran语言的新手,但我认为值得尝试使用现成的程序,而不是自己在R上写一个新程序。

我要打开的文件是thisthis是数据手册,可以找到打开数据的代码行here。数据在开头包含一个576字节的标题行,可以使用this打开。

我做了什么: 将二进制文件保存在一个新文件夹中,我还保存了打开它的软件代码。将终端设置到后一个文件夹(cd /home/urs/../)后,从GNU-Linux终端运行:

# 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

编辑: 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

1 个答案:

答案 0 :(得分:1)

此代码中可能存在一些问题。例如,RECL在gfortran中以字节计算,但代码假定为4字节字(如英特尔所做)。不应明确指出RECL值。

尝试将RECL增加到4 * 144。如果有帮助,则此问题与Reading writing fortran direct access unformatted files with different compilers

重复