首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Fortran 90中错误读取二进制文件数据

问在Fortran 90中错误读取二进制文件数据
EN

Stack Overflow用户
提问于 2015-09-15 20:43:03
回答 1查看 870关注 0票数 1

我正在读一个二进制文件,它是用不同的程序编写的。开放和阅读的陈述似乎是成功的,我在前一篇文章中得到了帮助。但是,读取的数据与文件不匹配。我已经初始化了2D数组,但是在读取文件之后,数组并不保存数据,而是一个未初始化的数组。我已经张贴了下面的代码,以读取和打印出数组。有什么想法吗?

代码语言:javascript
复制
       allocate(dummy(imax,jmax))

       dummy = 0.0
       open(unit=io, file=trim(input), access='direct', iostat=ioer, &
            status='old', action='READ', recl=imax*jmax*4)

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

       j=0
       k=0
       read(unit=io,rec=1,iostat=ioer) dummy!(j,k)
       if(ioer/=0) then
         print*, 'Cannot open file'
       else
         print*,'success opening file'
       end if

       size: do j=1, imax
           do k=1, jmax
             if(dummy(j,k) > 0.) print*,'i-',j,'j-',k,'frp-',dummy(j,k)
           end do 
       end do size
       print*,'j-',j,'k-',k

以下是原稿:

代码语言:javascript
复制
  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

这是打印出来的一部分:

代码语言:javascript
复制
  i-         600 j-         213 frp-  4.1759680E-08
  i-         600 j-         220 frp-  8.8314310E-18
  i-         600 j-         221 frp-  2.7975964E-36
  i-         600 j-         246 frp-   461506.1    
  i-         600 j-         254 frp-   19.79016    
  i-         600 j-         255 frp-  2.0032716E-22
  i-         600 j-         260 frp-  1.0871451E+24
  j-         601 k-         401

这与它应有的部分相同:

代码语言:javascript
复制
  i-         600 j-         213 frp-   13.6999998    
  i-         600 j-         218 frp-   63.2000008    
  i-         600 j-         220 frp-   29.1416683    
  i-         600 j-         221 frp-   31.8032303    
  i-         600 j-         229 frp-   39.5000000    
  i-         600 j-         232 frp-   55.4714279    
  i-         600 j-         246 frp-   54.2200012    
  i-         600 j-         254 frp-   13.1636362    
  i-         600 j-         255 frp-   10.9028578    
  i-         600 j-         258 frp-   24.6888885    
  i-         600 j-         259 frp-   13.5619040    
  i-         600 j-         260 frp-   11.4000006    
  n-         601 m-         401

声明/分配说明:

代码语言:javascript
复制
 real, allocatable, dimension(:,:) :: dummy

 allocate(dummy(imax,jmax))

 dummy = 0.0

这两种写/读都是相同的& imax is 600 jmax是400

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 03:11:05

正如M.S.B在评论中所建议的那样,这是写文件的机器和正在读取的机器之间的一个恩典问题。

要查看这一点,请查看同一数组索引中这些值之间的差异:

代码语言:javascript
复制
i-         600 j-         213 frp-  4.1759680E-08
i-         600 j-         213 frp-   13.6999998 

如果第一个值4.1759680E-08是小endian,它的十六进制表示形式是33 33 5B 41。当在一台大终端机器上读取这个精确的表示时,它会读取为13.6999998。如果第一个值是大endian,第二个是小endian,那么问题是相同的,除了十六进制表示是41 5B 33 33。要解决这个问题,您需要确定写入文件的机器的安全性。

gfortran和Intel Fortran (以及其他可能的扩展)都提供了扩展,允许您指定未格式化输入文件的字节顺序。如果写入文件的机器是大endian,则在读取时将其添加到open语句中:

代码语言:javascript
复制
convert='big_endian'

如果写入文件的机器是小endian,则在读取时将其添加到open语句中:

代码语言:javascript
复制
convert='little_endian'

您表示您是在一台小endian机器上编写的,因此为了在大端机器上阅读它,请按以下方式打开它:

代码语言:javascript
复制
open(unit=io, file=trim(input), access='direct', iostat=ioer, &
        status='old', action='READ', recl=imax*jmax*4, &
        convert='little_endian')

你的阅读应该能正常工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32595263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档