I need to open a binary file for which the developer of the data provides a program written in Fortran. I am new to the Fortran language, but I think it is worth trying out to use the ready program rather than writing a new one myself on R.
The file I want to open is this, this is the data manual, and the lines of code to open the data can be found here. The data contain a 576-byte header line at the start which can be opened using this.
What I did: Saved the binary file in a new folder, in which I have also saved the code of the software that opens it. After setting the terminal into the latter folder (cd /home/urs/../), from the GNU-Linux terminal I run:
# 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 However, I get the following error:
Error: read error 5016 on file gpcp_v2.2_psg.1987 EDIT: The code in Fortran to open the data excluding the first row of header is the following:
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
5016 LIBERROR_SHORT_RECORD