我需要打开一个二进制文件,数据开发人员为其提供用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
答案 0 :(得分:1)
此代码中可能存在一些问题。例如,RECL在gfortran中以字节计算,但代码假定为4字节字(如英特尔所做)。不应明确指出RECL值。
尝试将RECL增加到4 * 144。如果有帮助,则此问题与Reading writing fortran direct access unformatted files with different compilers
重复