Io 如何跳过Fortran未格式化文件中的数组?

Io 如何跳过Fortran未格式化文件中的数组?,io,fortran,binaryfiles,Io,Fortran,Binaryfiles,我的程序读取Fortran中的“未格式化”文件。除此之外,这个文件包含一个我的程序不需要的数组,但它可能会变得相当大。我想跳过这个数组 如果这是写入数据的程序: program write real :: useless(10), useful=42 open(123, file='foo', form='unformatted') write(123) size(useless) write(123) useless write(123) useful end progr

我的程序读取Fortran中的“未格式化”文件。除此之外,这个文件包含一个我的程序不需要的数组,但它可能会变得相当大。我想跳过这个数组

如果这是写入数据的程序:

program write
  real :: useless(10), useful=42

  open(123, file='foo', form='unformatted')
  write(123) size(useless)
  write(123) useless
  write(123) useful
end program write
那么这对阅读是有效的:

program read
  integer :: n
  real, allocatable :: useless(:)
  real :: useful

  open(123, file='foo', form='unformatted')
  read(123) n
  allocate(useless(n))
  read(123) useless
  read(123) useful

  print*, useful
end program read
但我希望避免分配“无用”数组。我发现了这个

program read2
  integer :: n, i
  real :: useless
  real :: useful

  open(123, file='foo', form='unformatted')
  read(123) n
  do i=1,n
     read(123) useless
  end do
  read(123) useful

  print*, useful
end program read2
不起作用(因为记录长度被写入文件[编辑,请参见francescalus的答案])


更改文件格式不是一个选项。

读取的文件存储单元少于记录中的存储单元并不是一个罪过

program read
  real :: useful

  open(123, file='foo', form='unformatted')
  read(123)
  read(123)
  read(123) useful

  print*, useful
end program read
每次“空”读取仍会使连接用于顺序访问的文件的记录前进


作为进一步的评论:第二次尝试并没有因为“记录长度”而失败。由于尝试读取单独的记录,因此失败。这种差异的重要性的例子可以在许多SO帖子中找到。

弗朗西斯卡勒斯展示了如何跳过整行。如果一行包含一些应跳过的数据以及一些要读取的数据,则可以重复读取伪变量以跳过错误数据。下面是一个演示这一点的程序

program write
real :: dummy,useless(10), useful=42
integer, parameter :: outu = 20, inu = 21
character (len=*), parameter :: fname = "foo"
integer :: n
call random_seed()
call random_number(useless)
open(outu, file=fname, form='unformatted', action = "write")
write(outu) size(useless)
write(outu) useless
write(outu) useful
close(outu)
open(inu, file=fname, form='unformatted', action = "read")
read (inu) n
read (inu) (dummy,i=1,n)
read (inu) useful
write (*,*) "useful = ",useful
end program write