我正在使用类似FORMAT的语句为Fortran输入和输出编写预处理器和后处理器(有理由不使用FORTRAN库)。我想正确对待新行(“/”)字符。我没有立即提供Fortran编译器。是否有一个简单的算法来计算出写入或消费的换行数(这篇文章只给出了阅读示例)
[请在FORTRAN代码中假设类似FORTRAN77的心态并更正我的任何FORTRAN语法]
更新:还没有评论所以我很少找到编译器并自己运行它。如果我没有被打败,我会发布答案。没有人评论我的格式语法错误。我已经改变了,但可能仍有错误
假设数据文件1
a
b
c
d
等...
(a)READ命令是否总是使用换行符?确实
READ(1, '(A)') A
READ(1, '(A)') B
给A ='a',B ='b'
(b)
是什么READ(1,'(A,/)') A
READ(1,'(A)') B
给B? (我会假设'c')
(c)
是什么READ(1, '(/)')
READ(1, '(A)') A
给予A(是'b'还是'c')
(d)
是什么READ(1,'(A,/,A)') A, B
READ(1,'(A)') C
给出A和B和C(我可以假设'a'和'b'和'c')
(e)
是什么READ(1,'(A,/,/,A)') A, B
READ(1,'(A)') C
给出A和B和C(我可以假设'a'和'c'和'd')?
是否存在'/'多余的情况?
答案 0 :(得分:2)
准确地说,由字符/
表示的斜杠编辑描述符实际上是记录说明符的结尾。我现在要引用Fortran 2008标准草案,我不认为自FORTRAN77以来编程语言在这方面的行为发生了变化,但我不确定。我引用标准是因为(a)如果你正在编写预处理器和后处理器,我想你会希望它遵守标准而不是对它的一些模糊解释,这是我能提供的,并且( b)Fortran I / O语句有很多变化,我只熟悉它们中的一些(而且这不是其中之一)。
10.8.2斜线编辑
1斜杠编辑描述符表示与当前记录之间的数据传输结束。
2从连接的文件输入以进行顺序访问或流访问时,将跳过当前记录的剩余部分,并将文件放在下一条记录的开头。该记录成为当前记录。在输出到为顺序或流访问而连接的文件时,在当前记录之后创建一个新的空记录;然后,这条新记录成为文件的最后一条和当前记录,文件位于此新记录的开头。
3对于为直接访问而连接的文件,记录号增加1,文件位于具有该记录号的记录的开头,如果有这样的记录,则该记录变为目前的记录。
(注10.25可以在输出中写入不包含字符的记录。如果文件是内部文件或连接用于直接访问的文件,则记录将填充空白字符。可能会跳过整个记录输入。)
4斜杠编辑描述符中的重复规范是可选的。如果未指定,则默认值为1.
因此,斜杠可用于读取部分读取记录的结尾并完全跳过记录( mutatis mutandis 用于写入)。
如果我编译您的程序(Mac OS X上的Intel Fortran 11.1),我会得到以下输出:
a
b
====== example b
a
c
====== example c
c
====== example d
a
b
c
====== example e
a
c
d
====== example f
a
b
这表明,根据我对标准的解释,gfortran表现出非标准的行为。但是,我怀疑如果你在I / O操作中更具体,你可能想要在READ和WRITE中指定记录长度,你可能能够实现你想要的。
答案 1 :(得分:0)
由于目前尚无评论,我正在添加自己的答案。 (如果有人为此增加了光,我会给他们投票)。
程序:
program TEST
character (len=80) :: a,b,c
write(6,'(a)') '====== example a'
open(1,file='test1.dat',form='formatted',status='old',action='read')
READ(1, '(A)') a
READ(1, '(A)') b
write(6,'(a)') a
write(6,'(a)') b
close(1)
write(6,'(a)') '====== example b'
open(1,file='test1.dat',form='formatted',status='old',action='read')
READ(1, '(A,/)') a
READ(1, '(A)') b
write(6,'(a)') a
write(6,'(a)') b
close(1)
write(6,'(a)') '====== example c'
open(1,file='test1.dat',form='formatted',status='old',action='read')
READ(1, '(/)')
READ(1, '(A)') A
write(6,'(a)') a
close(1)
write(6,'(a)') '====== example d'
open(1,file='test1.dat',form='formatted',status='old',action='read')
READ(1, '(A,/,A)') a,b
READ(1, '(A)') c
write(6,'(a)') a
write(6,'(a)') b
write(6,'(a)') c
close(1)
write(6,'(a)') '====== example e'
open(1,file='test1.dat',form='formatted',status='old',action='read')
READ(1,'(A,/,/,A)') a, b
READ(1,'(A)') c
write(6,'(a)') a
write(6,'(a)') b
write(6,'(a)') c
close(1)
write(6,'(a)') '====== example f'
open(1,file='test1.dat',form='formatted',status='old',action='read')
READ(1, '(A1)') a
READ(1, '(A1)') b
write(6,'(a)') a
write(6,'(a)') b
close(1)
end
在gfortran下编译给出:
gfortran -O2 -c test.f90
gfortran -o test.x *.o
C:\test>test.x
====== example a
a
b
====== example b
a
c
====== example c
c
====== example d
a
b
c
====== example e
a
c
d
====== example f
a
b
问题: 为什么所有输出之间都有额外的新线?读入的字符串中是否有换行符?
答案 2 :(得分:0)
这些新线路实际上是79个印刷空间。对你的write语句使用LEN_TRIM()函数,如下所示: 写(6,'(a)')a(1:LEN_TRIM(a)) 或将字符字段的长度更改为(1)