执行随数据文件提供的 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 代码时出现读取错误的主要内容,如果未能解决你的问题,请参考以下文章
Fortran编程(文件输入输出( File Input Output))——笔记4