使用FORMAT语句读取换行符

时间:2010-12-12 09:59:03

标签: fortran

我正在使用类似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')?

是否存在'/'多余的情况?

3 个答案:

答案 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)