【问题标题】:reading newlines with FORMAT statement使用 FORMAT 语句读取换行符
【发布时间】:2011-01-08 05:50:16
【问题描述】:

我正在使用类似 FORMAT 的语句为 Fortran 输入和输出编写预处理器和后处理器(有理由不使用 FORTRAN 库)。我想正确处理换行符(“/”)。我没有立即可用的 Fortran 编译器。是否有一个简单的算法可以计算出写入或消耗了多少换行符(这篇文章只是给出了阅读示例)

[请在 FORTRAN 代码中假设类似于 FORTRAN77 的心态并纠正我的任何 FORTRAN 语法]

更新:还没有 cmets,所以我只能找到一个编译器并自己运行它。如果我没有被打败,我会发布答案。没有人评论我的格式语法错误。我已经改了,但可能还是有错误

假设数据文件 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')吗?

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

【问题讨论】:

    标签: fortran


    【解决方案1】:

    确切地说,由字符/ 表示的斜线编辑描述符实际上是记录说明符的结尾。我现在要引用 Fortran 2008 标准草案,我认为自 FORTRAN77 以来编程语言的行为在这方面没有改变,但我不确定。我引用标准是因为(a)如果您正在编写预处理器和后处理器,我想您会希望它遵守标准而不是对它的一些模棱两可的解释,这是我所能提供的,并且( b) Fortran I/O 语句有很多变体,我只熟悉其中的几个(这不是其中之一)。

    10.8.2 斜线编辑

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

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

    3 对于为直接访问而连接的文件,记录号加一,文件位于具有该记录号的记录的开头,如果有这样的记录,则该记录变为当前记录。

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

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

    因此,斜线可用于读取部分读取记录的末尾并完全跳过记录(比照用于写入)。

    如果我编译你的程序(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 中指定记录长度,您可能能够实现您想要的。

    【讨论】:

    • 非常感谢您的回复!为什么要连接三个'a'?顺便说一句,问题是我不得不猜测使用的格式。我实际上正在使用 Java 进行解析,但我想确保尽可能好地处理斜线。
    • 啊,抱歉输出令人困惑,我使用的输入文件与您的韩元不同。我现在已经更正了。
    【解决方案2】:

    由于到目前为止还没有 cmets,我正在添加我自己的答案。 (如果有人对此有所了解,我会给他们投票)。

    程序:

    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
    

    问题: 为什么所有输出之间都有额外的新行?读入的字符串中是否有换行符?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 2023-02-17
        • 2017-11-16
        • 2020-07-07
        相关资源
        最近更新 更多