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

Multidimensional array 在Fortran 90中读取二进制网格文件,multidimensional-array,fortran,binaryfiles,Multidimensional Array,Fortran,Binaryfiles,当我试图读入我以前写进另一个程序的二进制文件时,我遇到了问题。我已经能够在没有编译错误的情况下打开它并将其读取到数组中,但是,该数组没有填充(全部为0)。任何建议或想法都很好。以下是我使用的open/read语句: allocate(dummy(imax,jmax)) open(unit=io, file=trim(input), form='binary', access='stream', & iostat=ioer, status

当我试图读入我以前写进另一个程序的二进制文件时,我遇到了问题。我已经能够在没有编译错误的情况下打开它并将其读取到数组中,但是,该数组没有填充(全部为0)。任何建议或想法都很好。以下是我使用的open/read语句:

       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)

首先,据我所知,
表单有两个可能的值:
“格式化的”
“未格式化的”

其次,要阅读,应该使用与用于编写文件的
open
语句对称的
open
语句,除非您确切知道自己在做什么。我建议您在阅读时,首先使用以下内容:

open(unit=io, file=trim(input), access='direct', &
        iostat=ioer, status='old', action='READ', recl = i_max*j_max*4)
它对应于用于保存文件的open语句。

因为,文件的写入方式和读取方式不匹配

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

当打开文件进行写入时,它使用直接访问方法来访问未格式化的记录。记录未格式化,因为这是默认值(在
表单=
说明符不存在的情况下)

打开文件进行读取时,使用非标准扩展名
form=“binary”
和流访问。这可能没有什么问题,但确实需要小心

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

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

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


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

为什么不在读取后检查
ioer
的值呢?很好的调用,ioer打印的“无法打开文件”文件存在吗?打印
input
变量的值并检查它是否真的指向您的文件Francescalus,您对我的read语句有什么建议吗?我尝试了几种不同的方法,但都出现了编译错误。调试代码时,我通常根本不会指定
iostat
。这样,您会得到(通常)可智能系统生成的错误消息。
form=binary
是一种过时的、流行的扩展。直接读取也需要更改。@francescalus您知道是哪个标准在open语句中引入了
'binary'
作为
表单
?我最近阅读了fortran 2008关于
open
语句的草稿,但我不记得曾经读过。@innoSPG扩展名,根据定义,不是标准的一部分。它不是标准的,但ifort有它。请注意,您应该能够很好地使用streams来读取通过直接访问编写的文件。