此问题在以前的SO问题中有所涉及。但是,之前的讨论似乎有些不完整。
Fortran有几个I / O语句。有READ(*,*)
和WRITE(*,*)
等。第一个星号(*)是标准星号,用于指定键盘输入或输出到屏幕的输入或输出。我的问题是关于第二个星号:
第二个星号表示I / O元素的格式,即正在使用的数据TYPE。如果此星号保持不变,则fortran编译器使用默认格式(根据编译器可能是这样)。用户必须使用许多格式描述符来指定数据类型,精度等。
(1)这些格式描述符是否适用于所有Fortran编译器和所有版本的Fortran?
(2)我在哪里可以找到这些格式描述符的标准列表?例如,F8.3
表示应使用带有字段宽度8和3位小数的固定点表示法打印该数字。
编辑:可以在此处找到编辑描述符的参考:http://fortranwiki.org/fortran/show/Edit+descriptors
答案 0 :(得分:3)
首先,作为澄清,READ / WRITE语句中的第一个星号与您声明的含义略有不同。对于写入,它意味着写入默认文件单元(在linux世界中通常是标准输出),对于读取它意味着从默认文件单元读取(在linux世界中通常是标准的),其中任何一个都不一定连接到终端屏幕或键盘。
第二个星号表示使用列表定向IO。对于read语句,这通常很有用,因为您不需要输入的指定格式。它将行划分为由空格或逗号分隔的字段(可能是其他一些不常用的字段),并依次将每个字段读入与参数列表中该字段关联的变量,忽略未读字段,然后继续如果没有足够的字段被读入,则下一行(除非明确包括行终止字符\
)。
对于写入,这意味着允许编译器确定将变量写出的格式(我相信没有分隔符)。我相信它允许在运行时执行此操作,因此您几乎可以保证它尝试编写的值将适合所使用的格式说明符,因此您可以放心,您将无法获得{{1}写出来。缺点是您必须在参数列表中手动包含分隔符,否则所有数字将一起运行。
通常,使用列表定向读取更方便用户,因此它们不必将其输入适合于严格定义的字段,并且列表定向写入对程序员来说是方便的,如果它们是不确定输出会是什么样子。
答案 1 :(得分:1)
当你有read(*,*) ...
之类的数据传输语句时,了解这意味着什么是有帮助的。 read(*,*)
等同于更详细的read(unit=*, fmt=*)
。第二个星号,就像你拥有它一样,使这个读取语句(或相应的写语句)列表定向。
如其他地方所述,列表导向的输入/输出对程序员来说是方便的。 Fortran标准指定了编译器必须遵循的许多约束,但是这种语言具有“合理值”之类的内容,因此允许输出因编译器,设置等而异。
同样,如其他地方所述,对输出(或输入)的精细用户控制伴随着给出格式规范。而不是read(*,fmt=*)
,而不是read(*,fmt=1014)
或read(*,fmt=format_variable_or_literal)
。我认为你的问题是:这种格式规范是什么?
我不会详细介绍所有可能的编辑描述符,但我会回答(2):您可以在Fortran标准中找到这些编辑描述符的列表(Fortran 2008的第10条进入所有细节)或一本好的参考书。
回答(1):不,编辑描述符不是通用的。甚至跨Fortran标准。值得注意的是:
I0
(和其他最小宽度说明符); H
编辑描述符; DT
编辑描述符。