【问题标题】:Reading binary input in Fortran90在 Fortran90 中读取二进制输入
【发布时间】:2013-10-10 10:46:16
【问题描述】:

有人使用以下子程序为我生成了一个输出

subroutine write(...)
REAL*8 v(a), h(b), f(b)
integer iv(b+1), jv(a)

 write(ium) a, b, c, d, e
 write(ium) (iv(i),i=1,b+1)
 write(ium) (jv(i),i=1,a)
 write(ium) (v(i),i=1,a)
 write(ium) (f(i),i=1,b)
 write(ium) (h(i),i=1,b)

return
end

我知道 a、b、c、d 和 e 都将是整数(尽管例程没有指定它们,可以吗?!)。整个输出进入了他发送给我的二进制文件,我现在想检索所有(分离的)信息。

我真的不太了解 Fortran I/O,所以我希望有人能提供帮助...

【问题讨论】:

  • 不,因为我得到的关于他如何编写文件的唯一信息就是这个例程......

标签: io binary fortran


【解决方案1】:

这里是一个简单的例子,基本上只是用read交换write。注意首先分配数组。

program test
  implicit none

  integer,parameter   :: ium=1234
  integer             :: a=1, b=2, c=3, d=4, e=5
  REAL*8,allocatable  :: v(:), h(:), f(:)
  integer,allocatable :: iv(:), jv(:)
  integer             :: i, stat

  ! Set values
  allocate( v(a), h(b), f(b), iv(b+1), jv(a), stat=stat )
  if (stat/=0) stop 'Cannot allocate memory!'

  v=1.d0
  h=2.d0
  f=3.d0
  iv = 4
  jv = 5

  write(*,*) v, h, f

  ! Write back
  open(unit=ium, file='test',form='unformatted',status='replace',action='write')

  write(ium) a, b, c, d, e
  write(ium) (iv(i),i=1,b+1)
  write(ium) (jv(i),i=1,a)
  write(ium) (v(i),i=1,a)
  write(ium) (f(i),i=1,b)
  write(ium) (h(i),i=1,b)

  close(ium)

  ! Scratch
  deallocate( v, h, f, iv, jv )

  !========================================
  ! Read in
  open(unit=ium, file='test',form='unformatted',status='old',action='read')

  read(ium) a, b, c, d, e
  ! Allocate arrays
  allocate( v(a), h(b), f(b), iv(b+1), jv(a), stat=stat )
  if (stat/=0) stop 'Cannot allocate memory!'

  read(ium) (iv(i),i=1,b+1)
  read(ium) (jv(i),i=1,a)
  read(ium) (v(i),i=1,a)
  read(ium) (f(i),i=1,b)
  read(ium) (h(i),i=1,b)

  close(ium)
  write(*,*) v, h, f

  deallocate( v, h, f, iv, jv )
end program

根据您的需要进行调整。

【讨论】:

  • +1 -- 值得注意的是,“未格式化”的 fortran 不一定是平台可移植的,因此如果失败,您可能需要深入挖掘。 (而且这不是交换数据的可取方式)
猜你喜欢
  • 2021-09-17
  • 2010-12-08
  • 1970-01-01
  • 2014-10-15
  • 2011-02-20
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多