【发布时间】: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 的回答; stackoverflow.com/questions/38176611/…
-
我阅读了 IanH 的答案,但似乎与我在这里提到的麻烦无关
-
@Francois Jacq,我认为您需要花一些时间了解 Fortran 标准。假设您使用
access=stream打开了一个 1 MB 的文件。对于某些单元号fd和变量x,您可以使用write(unit=fd,pos=100) x写入该文件中的位置100。如果您立即关闭该文件,该文件的大小是多少?