gfortran出现问题:未格式化的流文件似乎记录了文件结束记录

时间:2018-08-09 09:34:34

标签: fortran gfortran

我尝试在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自由软件基金会,Inc. 这是免费软件;请参阅复制条件的来源。没有 保证;甚至不是出于适销性或针对特定目的的适用性。

在gfortran中出错还是在某个地方出错?

1 个答案:

答案 0 :(得分:1)

根据高效能标记的建议,这是我自己的问题的答案:

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

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

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