如果你说的Fortran90+是指你满意Fortran 2003,那么可以选择用户定义派生类型IO选项。这允许你在写语句中包装所需的额外的簿记。我将在底部放置示例代码。
如果您不想使用此功能,可能是因为您没有支持它的编译器(我已经测试过ifort 14),那么您可以轻松地模拟簿记。
关键部分只是发送并再次读取大小并在读取之前分配变量。
代码:
module types
type core
integer, dimension(8) :: indx
end type core
type sample
integer :: a
real*8, dimension(:), allocatable :: b
type(core), dimension(:), allocatable :: c
contains
procedure write_sample
procedure read_sample
generic :: write(unformatted) => write_sample
generic :: read(unformatted) => read_sample
end type sample
contains
subroutine write_sample(dtv, unit, iostat, iomsg)
class(sample), intent(in) :: dtv
integer, intent(in) :: unit
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg
integer i
write(unit, iostat=iostat, iomsg=iomsg) SIZE(dtv%b), SIZE(dtv%c)
write(unit, iostat=iostat, iomsg=iomsg) dtv%a, dtv%b, &
(dtv%c(i)%indx, i=1,SIZE(dtv%c))
end subroutine write_sample
subroutine read_sample(dtv, unit, iostat, iomsg)
class(sample), intent(inout) :: dtv
integer, intent(in) :: unit
integer, intent(out) :: iostat
character(*), intent(inout) :: iomsg
integer i
integer sizeb, sizec
read(unit, iostat=iostat, iomsg=iomsg) sizeb, sizec
allocate(dtv%b(sizeb), dtv%c(sizec))
read(unit, iostat=iostat, iomsg=iomsg) dtv%a, dtv%b, &
(dtv%c(i)%indx, i=1,SIZE(dtv%c))
end subroutine read_sample
end module types
program save_it
use types
implicit none
integer i, unit_in, unit_out
type(sample) :: save
type(sample) :: save_test
save%a = 14
save%b = [(i*1., i=1, 10)]
save%c = [core([(i, i=1,8)]), core([(i, i=11, 18)])]
open(newunit=unit_out, file='serial', form='unformatted', &
status='replace', action='write')
write(unit_out) save
close(unit_out)
open(newunit=unit_in, file='serial', form='unformatted', &
status='old', action='read')
read(unit_in) save_test
close(unit_in)
end program save_it
肯定有很多工作要做,使其更加强大稳定。
generic :: write(unformatted) => write_sample
,Error: Expected '=>' at (1)
。如果我删除(unformatted)
,我会得到以下错误信息:write(unit_out) save
,Error: Data transfer element at (1) cannot have ALLOCATABLE components unless it is processed by a defined input/output procedure
。 - Jeff Irwin//
运算符,然后将我的类型与其他要打印的字符连接起来。 - Jeff Irwin