在 Fortran 中做什么READ()
?
例如:
READ(1,82)
1 是文件句柄,您必须使用正确的打开调用打开它。82 是一个引用格式的标签,表示您将如何根据视觉格式报告数据。
program foo
implicit none
integer :: i
double precision :: a
write (*,*) 'give me an integer and a float'
read (*,82) i,a
write (*,82) i,a
82 format (I4, F8.3)
end program
在此示例中,程序从标准输入(未指定其单元号,因此我放一个 *)接受整数和浮点值。格式表示整数占据前四列,然后我有一个浮点数,它保留在 8 列中,小数点后有 3 位
如果我现在运行程序,但我没有完全遵循这种格式,程序会报错并崩溃,因为前 4 列应该代表一个整数(由于 I4 格式)和“5 3”。不是有效整数
$ ./a.out
give me an integer and a float
5 3.5
At line 7 of file test.f (Unit 5)
Traceback: not available, compile with -ftrace=frame or -ftrace=full
Fortran runtime error: Bad value during integer read
但是,正确的规范(请注意数字 5 前的三个空格)将执行正确的操作(稍有宽容,并不那么严格)
$ ./a.out
give me an integer and a float
5 3.5
5 3.500
$
根据标签 82 处的 FORMAT 语句,它从第 1 号“单元”(打开的文件)读取。但是,由于该语句没有列出任何变量,它没有地方放置它正在读取的数据,这不太可能有帮助;READ(1,82) FOOBAR
将其读取的数据放入变量 FOOBAR 会更有用。
您可以使用 fortran “read” 语句做更多的事情。
考虑:读取(单元#,格式,选项)...通用
read (7,*,end=10)
其中,“7”是读取的单元号,“*”是格式(本例默认),“10”是程序控制在读取设备/文件到达eof时跳转到的行号。“选项”槽可以填充诸如“err='要转到的行号'”或 iostat,advance="no" 之类的内容。您可以查看更多这些
格式部分是您可以更精确地指定您期望的数据格式的地方。例如,如果您有一个格式说明符,例如:
read (25,"(2X, 2I5, F7.3, A)")
这里的“2X”是指2个空格,“2I5”是指2个5位数的整数,“F7.3”是指总长度为7的十进制值,后面有3位数十进制。“A”指的是一个字符。您可以查看更多这些
干杯!
“1”用于在 fortran 中打开文件的单位,“82”指定读取命令的格式。
open(1,file=fname,status='unknown')
read(1,82) var_name
82 format(2I5)
上面的代码打开一个名为“fname”的文件,读取命令从文件 fname 中读取,因为它以单位“1”打开,读取命令以格式 82 指定的格式读取。下面给出了有关 fortran 格式的详细信息:
nim (Integer Specification)
nfm.d (Floating point Specification)
nEm.d(Exponential Specification)
nAm (string specification)
where
"m" is the number of character spaces reserved for printing. (should be more than what you are reading otherwise read statement would not give correct results)
"n" is the number of integers, floating point, characters or exponential numbers that you want to read.
"d" are the number of decimal places up to which you want to read.
它使用编号为 82 的语句指定的格式从单元 1 读取。
当 Fortran 从文件中读取时,它要求 READ 语句唯一地标识该文件。识别是使用 Fortran 单元标识符完成的。
单元标识符可以是以下之一:
1) 一个整数变量或表达式,其值大于或等于 0。
2) 星号 (*) 仅允许用于 READ 和 WRITE 语句。在 READ 语句中,星号表示单元 100(标准输入)。
最好使用 newunit 提供单元号
open(newunit=i,file='test')
在使用任何单元号之前,使用 INQUIRE 语句检查其有效性(存在),如下例所示:
logical :: idok, fop
inquire (unit=i, exist=idok, opened=fop)
if (idok .and. .not. fop) then
open (unit = i, ...)
endif
然后我们有 FORMAT 语句,这是一个带标签的语句,它可以出现在程序的任何可见格式的部分中。
它的形式
READ(*,100) I, J, K
FORMAT 语句
100 FORMAT(I10,I10,I10)
稍有不同的 FORMAT 语句是
100 FORMAT(3I10.8)
这再次产生三个宽度为 10 的右对齐整数,但这次需要打印至少 8 位数字。