读取二进制文件会导致错误“格式化I / O到单元打开以进行无格式传输”

时间:2018-01-24 21:53:19

标签: fortran binaryfiles intel-fortran

我正在尝试在Fortran中打开一个.binary文件。在Visual Studio 2010中,它看起来像这样(左边是行号,中间是十六进制,右边似乎是十六进制每个字节的ASCII表示。

Screenshot of the binary file content

我想我知道如何破译十六进制(每4个字节左右是一些信息),我可以直观地阅读它,所以我知道一旦我得到一个程序读取它我想做什么,但是我做这件事很困难。

我尝试了几种不同的选项,例如:

open(123, file=inputname,status='old', iostat=ierr,form='unformatted',err=90, access='stream')
read(123,*), line

forrtl: severe (257): formatted I/O to unit open for unformatted transfers, unit 123
----
! Trying some formatting and also now form='formatted' !
open(123, file=inputname, status='old', iostat=ierr, form='formatted',err=90,access='stream')
read(123,*), line

100 format (4(Z4.8))

forrtl: severe (64): input conversion error, unit 123
----
! formatted and removed the output formatting !
open(123, file=inputname, status='old', iostat=ierr, form='formatted',err=90,access='stream')
read(123,*), line

forrtl: severe (59): list-directed I/O syntax error, unit 123
----

依此类推,我尝试了其他几种组合。我错过了什么吗?

(注意:所有错误都在READ命令上触发)

1 个答案:

答案 0 :(得分:0)

看起来有点像DEBUG.EXE的输出,其中第一个条目是第一个字节的十六进制地址,然后是十六进制中接下来的16个字节的值,然后是带有由句点表示的不可打印字符的ASCII表示。遗憾的是你没有发布确切的文件,所以我们不得不从图片中猜测,但是写了一个试用程序,其格式是我最好的猜测行,作为文件的性质。问题

program readit
   use ISO_FORTRAN_ENV
   implicit none
   integer(INT32) number
   integer(INT8) data(16)
   character(16) string
   integer i
   integer iunit
   open(newunit=iunit,file='sample.txt',status='old')
   do i = 1, 1000000
      read(iunit,'(Z8,2(1x,8(1x,Z2)),2x,A16)',end=10) number,data,string
      write(*,'(*(g0:1x))') number,data,string
   end do
10 continue
end program readit

编辑:我误解了您发布的图片中显示的内容。更有理由发布实际文件。如果文件内容的每4个字节是有意义的输入,您只能以流格式读取它:

program readstream
   use ISO_FORTRAN_ENV
   implicit none
   integer(INT32) stuff
   integer iunit
   open(newunit=iunit,file='sample.txt',status='old',access='stream')
   do
      read(iunit,end=10) stuff
      write(*,'(Z8.8)') stuff
   end do
10 continue
end program readstream