【问题标题】:Why does Fortran output have a leading space?为什么 Fortran 输出有前导空格?
【发布时间】:2012-05-16 22:25:43
【问题描述】:

我处理了 Fortran 程序的大量输出,这些程序的输出通常看起来有一个前导空格,即第 1 列字符是空白的。考虑一个小程序leading.f

      program leading
      print *, "<-- What's that space for?"
      end program leading

有输出

 <-- What's that space for?

(是的,开头有一个空格字符)。我的问题包含在程序中。

【问题讨论】:

  • 不知道它的用途是什么,如果您愿意,可以按照以下方法抑制它:使用字符串格式的输出而不是未格式化的输出:write(*,"(A)")"a space, really?"

标签: formatting fortran whitespace


【解决方案1】:

早在恐龙时代,当 FORTRAN 输出通常进入绿条冲击式打印机时,第一个打印列中的某些字符通常被解释为控制代码(换行、换页等)。许多程序员学会了将输出的第 1 列显式地清空,除非有某种特殊效果——而且旧习惯很难改掉!

【讨论】:

    【解决方案2】:

    正如在此处和其他地方的另一个答案中所指出的,Fortran 输出具有 托架控制 的概念。对于使用回车控制的打印机,第一个字符是空格是开始新行所必需的。

    Fortran itself deleted Fortran 2003 中的回车控制概念,但为了完整起见,我们可以看到 Fortran 仍然要求列表导向的输出(在大多数情况下)具有此(默认)前导空白(Fortran 2018,13.10.4 p. 13):

    除了在定义的输出过程中通过显式格式化或通过连续的分隔字符序列创建的新记录外,每个输出记录都以空白字符开头。

    名单格式也有类似的说法。

    您可以通过避免使用列表导向输出来避免出现此前导空白:

    print '(A)', '<-- No space here'
    end
    

    注意这里不是print,而是列表导向的输出,这是罪魁祸首。我们看到与write类似:

    write (*,*) '<-- Space from the list-directed output'
    end
    

    最后,如果我们使用 internal files,我们仍然会得到一个前导空白和列表导向的输出:

    character(len=20) :: internal
    write (internal, *) '<-- Leading blank here'
    end
    

    (如果我们随后以列表导向的方式输出此内部文件,我们将看到 两个 前导空白。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多