我处理了来自 Fortran 程序的大量输出,这些程序的输出通常看起来有一个前导空格,即字符列 1 是空白的。考虑一个简短的程序leading.f
:
program leading
print *, "<-- What's that space for?"
end program leading
有输出
<-- What's that space for?
(是的,开头有一个空格字符)。我的问题包含在程序中。
我处理了来自 Fortran 程序的大量输出,这些程序的输出通常看起来有一个前导空格,即字符列 1 是空白的。考虑一个简短的程序leading.f
:
program leading
print *, "<-- What's that space for?"
end program leading
有输出
<-- What's that space for?
(是的,开头有一个空格字符)。我的问题包含在程序中。
回到恐龙时代,当 FORTRAN 输出通常进入绿色条形打印机时,第一个打印列中的某些字符通常被解释为控制代码(换行、换页等)。许多程序员学会了将输出的第 1 列显式地清空,除非有某种特殊效果——而且旧习惯很难改掉!
正如在此处和其他地方的另一个答案中所指出的那样,Fortran 输出具有运输控制的概念。对于使用回车控制的打印机,第一个字符是空格是开始新行所必需的。
Fortran本身在 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
最后,如果我们使用内部文件,我们仍然会得到一个带有列表导向输出的前导空白:
character(len=20) :: internal
write (internal, *) '<-- Leading blank here'
end
(如果我们用列表导向的输出输出这个内部文件,我们会看到两个前导空白。)