gfortran 的问题:文件末尾记录似乎用未格式化的流文件记录得很糟糕

Trouble with gfortran : the end-of-file record seems badly recorded with unformatted stream files

我尝试在我的 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 window 中输入命令 "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 中的错误或某处错误?

根据 High Performance Mark 的建议,这是我自己的问题的答案:

打开现有文件时,access="Stream" 和 access="sequential," 的行为与 Albert 早期评论中提到的不同:

  • 顺序访问中的 WRITE 语句自动删除其余部分 文件
  • 流访问中的 WRITE 语句保持文件的其余部分不变 (允许稍微修改文件而不必重写它 完全)

即使在流访问中也要返回顺序行为,有必要在 OPEN 语句中指定 status="replace"。