首页 > 解决方案 > 非超前读取后的位置

问题描述

在 N2137 第 12.3.4.2 节中它说

前进的输入/输出语句总是将记录文件放置在最后读取或写入的记录之后,除非出现错误情况。

在第 12.3.4.4 节中它说

对于非前进输入,如果没有发生错误条件或文件结束条件,但出现了记录结束条件 (12.11),则文件位于刚刚读取的记录之后。

因此,我会得出结论,读取具有推进输入的记录并遇到记录结束条件读取具有非推进输入的相同记录应该将文件位置留在同一位置。这是一个示例程序:

program testpos1
   implicit none
   integer iunit
   character(80) lineout
   character(:), allocatable :: linein
   integer i
   integer linelen
   integer pos
   integer size

   open(newunit=iunit,file='testpos1.txt',status='replace')
   do i = 1, 2
      write(lineout,'(*(g0))') i,' line ',i
      write(iunit,'(*(g0))') trim(lineout)
   end do
   close(iunit)
   linelen = len_trim(lineout)
   allocate(character(linelen) :: linein)
   open(newunit=iunit,file='testpos1.txt',status='old',access='stream',form='formatted')
   inquire(iunit,pos=pos)
   write(*,'(*(g0))') 'Position on open = ',pos
   read(iunit,'(a)',advance='no',eor=9999,size=size) linein
   inquire(iunit,pos=pos)
   write(*,'(*(g0))') 'Position after exact read of first line = ',pos
   read(iunit,'(a)',advance='no',eor=10,size=size) linein
   write(*,'(*(g0))') 'Catastrophic failure to hit EOR on line 1'
   stop
10 continue
   inquire(iunit,pos=pos)
   write(*,'(*(g0))') 'Position reading past EOR on first line = ',pos
   rewind(iunit)
   inquire(iunit,pos=pos)
   write(*,'(*(g0))') 'Position on rewind = ',pos
   read(iunit,'()')
   inquire(iunit,pos=pos)
   write(*,'(*(g0))') 'Position after advancing read of first line = ',pos
   rewind(iunit)
   deallocate(linein)
   allocate(character(linelen+1) :: linein)
   inquire(iunit,pos=pos)
   write(*,'(*(g0))') 'Position on rewind = ',pos
   read(iunit,'(a)',advance='no',eor=20,size=size) linein
   write(*,'(*(g0))') 'Catastrophic failure to hit EOR on line 1'
   stop
20 continue
   inquire(iunit,pos=pos)
   write(*,'(*(g0))') 'Position reading past EOR on first line = ',pos
   stop
9999 continue
   write(*,'(*(g0))') 'Catastrophic EOR after reading ',size,' bytes'
end program testpos1

使用 gfortran 8.1.0 输出

Position on open = 1
Position after exact read of first line = 9
Position reading past EOR on first line = 11
Position on rewind = 1
Position after advancing read of first line = 11
Position on rewind = 1
Position reading past EOR on first line = 11

这是我所期望的。但是 ifort 16.0.2 说

Position on open = 1
Position after exact read of first line = 9
Position reading past EOR on first line = 9
Position on rewind = 1
Position after advancing read of first line = 11
Position on rewind = 1
Position reading past EOR on first line = 9

所以我认为这是 ifort 中的一个错误?最新版本修复了吗?

标签: iofortranintel-fortran

解决方案


推荐阅读