在Fortran 90中读取二进制网格文件

时间:2015-09-11 19:01:52

标签: multidimensional-array fortran binaryfiles

我在尝试读取我之前写入另一个程序的二进制文件时遇到问题。我已经能够打开它并将其读取到没有编译错误的数组,但是,数组没有填充(全0)。任何建议或想法都会很棒。这是我正在使用的开放/读取语句:

       allocate(dummy(imax,jmax))
       open(unit=io, file=trim(input), form='binary', access='stream', &
            iostat=ioer, status='old', action='READWRITE')

       if(ioer/=0) then
        print*, 'Cannot open file'
       else
        print*,'success opening file'
       end if

       read(unit=io, fmt=*, iostat=ioer) dummy
       j=0
       k=0
       size: do j=1, imax
           do k=1, jmax
             if(dummy(j,k) > 0.) print*,dummy(j,k)
           end do
       end do size

如果您需要更多信息,请与我们联系。

以下是最初编写文件的方式:

    out_file = trim(output_dir)//'SEVIRI_FRP_.08deg_'//trim(season)//'.bin'

    print*, out_file
    print*, i_max,' i_max,',j_max,' j_max'

   open (io, file = out_file, access = 'direct', status = 'replace', recl = i_max*j_max*4)

   write(io, rec = 1) sev_frp
   write(io, rec = 2) count_sev_frp
   write(io, rec = 3) sum_sev_frp

   check: do n=1, i_max
     inna: do m=1, j_max

       !if (sev_frp(n,m) > 0) print*, count_sev_frp(n,m)

     end do inna
   end do check

   print*,'n-',n,'m-',m
   close(io)

2 个答案:

答案 0 :(得分:2)

首先,据我所知,form有两个可能的值:"FORMATTED""UNFORMATTED"

其次,要阅读,您应该使用与您用于编写文件的open语句对称的open,除非您知道自己在做什么。我建议您阅读,打开:

open(unit=io, file=trim(input), access='direct', &
        iostat=ioer, status='old', action='READ', recl = i_max*j_max*4)

这对应于您用于保存文件的open语句。

答案 1 :(得分:2)

作为innoSPG says,您在编写文件的方式和阅读方式方面存在不匹配。

外部文件可以使用以下三种访问方法之一连接:顺序;直接;流。此外,连接可以格式化或未格式化。

打开文件进行写入时,它使用直接访问方法和未格式化的记录。记录未格式化,因为这是默认值(在form=说明符的绝对值中)。

当您打开文件进行阅读时,请使用form="binary"的非标准扩展名并进行流访问。这可能没什么问题,但确实需要小心。

但是,使用read语句使用格式化(列表导向)输入。这是不允许的。

在上一个答案中建议的使用类似访问方法和记录长度的方法将需要进一步更改代码。 [你还需要以某种方式设置记录长度的值。]

您不仅需要删除格式,以匹配所写的未格式化记录,而且您还希望使用rec=说明符来访问文件的记录。

最后,如果您使用的是iostat=说明符,那么您应该检查结果值。