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

Posted

技术标签:

【中文标题】执行随数据文件提供的 Fortran 代码时出现读取错误【英文标题】:Read error when executing Fortran code that was provided with a data file 【发布时间】:2017-03-01 13:41:47 【问题描述】:

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

我要打开的文件是this,this是数据手册,打开数据的代码行可以找到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

【问题讨论】:

我相信我们需要看代码。 我没有关注你的链接。在此处发布最小的可重现代码。 BTW 错误 5016 是 5016 LIBERROR_SHORT_RECORD 【参考方案1】:

此代码中有些地方可能会出错。例如,RECL 在 gfortran 中以字节为单位,但代码假定为 4 字节字(如 Intel 所做的那样)。不应明确指出 RECL 值。

尝试将 RECL 增加到 4*144。如果有帮助,那么这个问题就是Reading writing fortran direct access unformatted files with different compilers

【讨论】:

以上是关于执行随数据文件提供的 Fortran 代码时出现读取错误的主要内容,如果未能解决你的问题,请参考以下文章

java传参调用fortran的exe可执行文件

关于用VS2012编写fortran时出现的问题

使用 Fortran 中的内存数据调用 C 代码

Fortran编程(文件输入输出( File Input Output))——笔记4

Fortran编程(文件输入输出( File Input Output))——笔记4

将 OpenMP 与 Fortran 一起使用时出现内存错误,运行 FFTW