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