gfortran 的问题:文件结尾记录似乎用未格式化的流文件记录得很糟糕
Posted
技术标签:
【中文标题】gfortran 的问题:文件结尾记录似乎用未格式化的流文件记录得很糟糕【英文标题】:Trouble with gfortran : the end-of-file record seems badly recorded with unformatted stream files 【发布时间】:2019-01-16 17:08:38 【问题描述】:我尝试在我的 Windows 计算机上生成一个 Unix 文本文件。
这里是输入文件“foo”的示例(带有 Windows 行尾字符)。该文件包含 10 行:
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
这是一个 Fortran 程序,将该文件转换为 Unix 文件,但只保留前五行:
program test
implicit none
character(255) :: line(1000)
integer :: i,n
open(15,file = "foo.txt")
do i=1,size(line)
read(15,'(a)',end=10) line(i)
enddo
10 continue
n=i-1
write(*,*) n
close(15)
open(15,file="foo.txt",form="unformatted",access="stream")
do i=1,5
write(15) 'unix ',trim(line(i))
write(15) achar(10)
enddo
close(15)
end program
但是当我在 cmd 窗口中输入命令“type foo.txt”时,我得到:
unix line 1
unix line 2
unix line 3
unix line 4
unix line 5
9
line 10
请注意文件末尾的两个意外的额外行!
gfortran 版本:
GNU Fortran(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)7.3.0 版权所有 (C) 2017 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。
gfortran 中的错误或某处错误?
【问题讨论】:
您期望得到什么?您在“行模式/记录模式”下阅读并在“流模式”下写入您覆盖的字符多于行上的字符,因此也覆盖了您认为没有触摸的行。 我预计只有 5 行,但我得到 7 行,好像第 5 行之后的文件结尾记录没有正确记录 看看 IanH 的回答; ***.com/questions/38176611/… 我阅读了 IanH 的答案,但似乎与我在这里提到的麻烦无关 @Francois Jacq,我认为您需要花一些时间了解 Fortran 标准。假设您使用access=stream
打开了一个 1 MB 的文件。对于某些单元号fd
和变量x
,您可以使用write(unit=fd,pos=100) x
写入该文件中的位置100。如果您立即关闭该文件,该文件的大小是多少?
【参考方案1】:
正如高性能标记所建议的,这是我自己问题的答案:
打开现有文件时,access="Stream" 和 access="sequential" 的行为与 Albert 早期评论中提到的不同:
顺序访问中的 WRITE 语句会自动删除其余语句 文件 流访问中的 WRITE 语句保持文件的其余部分完好无损 (它允许稍微修改文件而无需重写它 完全)即使在流访问中,要返回顺序行为,有必要在 OPEN 语句中指定 status="replace"。
【讨论】:
以上是关于gfortran 的问题:文件结尾记录似乎用未格式化的流文件记录得很糟糕的主要内容,如果未能解决你的问题,请参考以下文章
长度参数化的传递对象到类型绑定过程有 gfortran 抱怨