Fortran 使用FORMAT语句读取换行符

Fortran 使用FORMAT语句读取换行符,fortran,Fortran,我正在使用类似格式的语句为Fortran输入和输出编写一个预处理器和后处理器(有理由不使用Fortran库)。我希望正确处理新行(“/”)字符。我手头没有Fortran编译器。有没有一个简单的算法可以计算出写了多少新行或使用了多少新行 [请在FORTRAN代码中采用类似FORTRAN 77的思维方式,并纠正我的任何FORTRAN语法] 更新:还没有评论,所以我只能自己寻找一个编译器并运行它。如果我没有被打败的话,我会把答案贴出来。没有人评论我的格式语法错误。我已经更改了,但可能仍然有错误 假设数

我正在使用类似格式的语句为Fortran输入和输出编写一个预处理器和后处理器(有理由不使用Fortran库)。我希望正确处理新行(“/”)字符。我手头没有Fortran编译器。有没有一个简单的算法可以计算出写了多少新行或使用了多少新行

[请在FORTRAN代码中采用类似FORTRAN 77的思维方式,并纠正我的任何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
READ(1, '(/)')
READ(1, '(A)') A
给B?(我假设为“c”)

(c) 什么是

READ(1,'(A,/)') A
READ(1,'(A)') B
READ(1, '(/)')
READ(1, '(A)') A
给A(是“b”还是“c”)

(d) 什么是

READ(1,'(A,/,A)') A, B
READ(1,'(A)') C
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
READ(1,'(A,/,/,A)') A, B
READ(1,'(A)') C
给出A、B和C(我能假设‘A’和‘C’以及‘d’)吗


是否存在“/”多余的情况?

由于到目前为止没有评论,我将添加我自己的答案。(如果有人对此有所说明,我会给他们投票)

节目:

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
问题:
为什么在所有输出之间有额外的新行?在已读入的字符串中是否有换行符?

准确地说,由字符
/
表示的斜杠编辑描述符实际上是记录结束说明符。我现在将引用Fortran 2008标准草案,我认为自Fortran 77以来编程语言在这方面的行为没有改变,但我不确定。我引用标准是因为(a)如果你在编写前置和后置处理器,我想你会希望它遵守标准,而不是我所能提供的对它的模糊解释,(b)Fortran I/O语句中有太多的变体,我只对其中的一些非常熟悉(这不是其中之一)

10.8.2斜杠编辑

1斜杠编辑描述符表示与当前记录之间的数据传输结束

2从连接用于顺序或流访问的文件输入时,跳过当前记录的剩余部分,并将文件定位在下一个记录的开头。此记录成为当前记录。输出到连接用于顺序或流访问的文件时,将在当前记录之后创建新的空记录;然后,此新记录将成为文件的最后一条也是当前记录,并且文件将定位在此新记录的开头

3对于为直接访问而连接的文件,记录编号增加1,并且文件位于具有该记录编号的记录的开头(如果存在此类记录),并且该记录成为当前记录

(注10.25不包含字符的记录可写入输出。如果该文件是内部文件或为直接访问而连接的文件,则该记录用空白字符填充。输入时可跳过整个记录。)

4在斜杠编辑描述符中,重复指定是可选的。如果未指定,则默认值为1

因此,斜杠可以用于读取部分读取记录的末尾,也可以用于完全跳过记录(在写入时作必要的修改)

如果我编译您的程序(Mac OS X上的英特尔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操作中更加具体,您可能希望在读写中指定记录长度,您可能能够实现您想要的。

这些新行实际上是79个打印空间s、 使用LEN_TRIM()函数编写如下语句: 写(6),(a)a(1:LEN_TRIM(a))
或者将字符字段的长度更改为(1)

非常感谢您的回复!为什么有三个“a”连接在一起?顺便说一句,问题是我不得不猜测使用的格式。我实际上是在使用Java解析,但我想确保尽可能地处理斜杠。啊,很抱歉输出混乱,我使用了一个与您的输入文件不相同的输入文件。我已经更正了现在。