[SciPy-user] reading binary files written by a gfortran code...

Phil Austin phaustin at gmail.com
Sun Jun 15 12:10:30 EDT 2008


fred wrote:
> Hi,
> 
> Ok, this is a well known issue that binary files written by a fortran 
> program have a "special" format.
> 
> So my question is : is it possible to write binary file _using gfortran_
> (no problem with intel fortran compiler) without this formatting ?

You want to write/read direct access files, which are just the bytes
without the compiler-specific recordlength information.  Here is
an example of a some tutorial code I wrote for myself exercising
memmap and a fortran direct-access read -- just replace read with
write in the fortran code to get output

1) write a test binary  data file in python with fortran layout and make
sure you can read it back in using mmemap

import numpy as np
xdim=4
ydim=5
zdim=6
theData=np.empty([xdim,ydim,zdim],dtype=np.int32)
for i in np.arange(xdim):
     for j in np.arange(ydim):
         for k in np.arange(zdim):
             theData[i,j,k]=100*(i+1) + 10*(j+1) + (k+1)
print theData
fortout=open('fortout.dat','w')
Cout=open('Cout.dat','w')
theData.tofile(fortout)
theData.tofile(Cout)
fortout.close()
Cout.close()
theFout = np.memmap('fortout.dat', dtype=np.int32,\
                     shape=(xdim,ydim,zdim), order='F')
theCout = np.memmap('Cout.dat', dtype=np.int32, \
                     shape=(xdim,ydim,zdim), order='C')
for i in np.arange(xdim):
     for j in np.arange(ydim):
         for k in np.arange(zdim):
             theFout[i,j,k]=theData[i,j,k]
             theCout[i,j,k]=theData[i,j,k]
theFout.sync()
theCout.sync()


2) and now read fortout.dat using standard f95 direct access:

program readfile
integer,parameter :: xdim=4,ydim=5,zdim=6
integer(kind=4):: thevar(xdim,ydim,zdim)
integer :: i,j,k,recnum
open(unit=12,file="fortout.dat",access="direct",action="read",recl=4)
recnum=0
do i=1,xdim
   do j=1,ydim
      do k=1,zdim
         recnum=recnum+1
         read(12,rec=recnum) thevar(i,j,k)
         print *,i,j,k,thevar(i,j,k)
      enddo
   enddo
enddo
close(unit=12)
end



More information about the SciPy-User mailing list