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