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 与英特尔 MKL 链接

长度参数化的传递对象到类型绑定过程有 gfortran 抱怨

ab:无法读取POST数据文件:找到文件结尾

HEX 文件格式

在 Windows 上使用 GFortran 在 Matlab 中创建 Mex 文件

如何使用MinGW gfortran通过CMake构建/编译Fortran