io - 非超前读取后的位置
问题描述
在 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 中的一个错误?最新版本修复了吗?
解决方案
推荐阅读
- azure - 使用 Azure 的 Terraform - 如何创建存储帐户?
- arrays - 用 jq 折叠 JSON 对象
- angular - 路线更改后如何保留搜索输入值?角
- amazon-web-services - 无法使用 AWS 身份验证连接到 Docker 容器中的 Hashicorp Vault - x509 证书错误
- scala - 如何在 Scala Seq 中移动项目?
- python - 类和函数的装饰器
- python-3.x - 是否可以在 centos 7 docker 容器上运行 pyautogui
- r - R:删除数据框行内的重复项
- objective-c - NSDictionary 到 NSMutableArray 崩溃
- python - 对项目编号数组重复单个 POST