文件系统
目录
OPEN
OPEN,用于打开文件,文件读取操作有 “顺序读写” 和 “直接读写” 两种
Fortran
OPEN(UNIT=unit, FILE=filename, FORM='...', STATUS='...', ACCESS='...', RECL='...', ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION='...', PAD='...', DELIM='...')
OPEN 指令参数如下:
- UNIT: unit 文件绑定的标签
- FILE: filename 文件名
- FORM: 被打开文件的格式
- FORMATTED: 文本文件
- UNFORMATTED: 二进制文件,此时相应读写命令不能含有格式信息
- STATUS: 说明打开的文件状态
- NEW: 文件本不存在,创建一个新文件,文件存在会报错
- OLD: 打开已有文件,不存在时会报错
- REPLACE: 创建一个新文件,文件已存在时会被覆盖
- SCRATCH: 创建一个临时文件,此时无需指定文件名;临时文件会在程序结束时被删除
- UNKNOWN: 默认值,通常与 OLD 效果相同
- ACCESS
- sequential: 文件按照顺序读写(默认值)
- direct: 直接读写文件,读写操作可以任意指定文件中的位置
- stream: 读写二进制流,采用此访问方式不会产生额外信息
- RECL: length 单位是字符,默认值为 1
- 在顺序读取文件时,RECL 字段用来设置一次数据读写的最大量
- 在直接读取文件时,RECL 字段用于设置每一个模块中的字符数
- ERR: label 当文件打开发生错误时,程序会跳转到对应的 label 来继续执行
- IOSTAT: iostat io 流读取状态,将文件打开的状态传给 iostat 变量,其中 iostat > 0 表示文件打开操作发生错误,iostat = 0 表示文件打开操作正常,iostat < 0 表示文件终了
- BLANK
- POSITION: 设置文件打开时的读写位置
- ASIS: 保持文件打开时的读写位置不变
- REWIND: 文件打开时的读写位置为文件开头
- APPEND: 文件打开时的读写位置为文件结尾
- ACTION: 设置所打开文件的读写权限
- READ: 只读
- WRITE: 只写
- READWRITE: 读写,默认值
- PAD
- DELIM
WRITE 与 READ
WRITE 与 READ,用于读写文件
Fortran
WRITE/READ(UNIT=unit, FMT='...', NML='...', REC=record, IOSTAT=iostat, ERR=label, END=endlabel, ADVANCE='...', SIZE=size)
- NML: 指定要读写的 namelist
- REC=record: 在直接读取文件方式中,设置所要读写的文件模块位置
- END=endlabel: 指定在读到文件末尾时,要转移到 endlabel 对应的代码行继续执行
- ADVANCE='YES' OR 'NO': 设置在文本格式中,每次读写命令完成后,读写位置是否移到下一行。默认值是 'YES'
INQUIRE
INQUIRE,用于查询文件状态
Fortran
INQUIRE(UNIT=unit, FILE=filename, IOSTAT=iostat, ERR=label, EXIST=exist, OPENED=opened, NUMBER=number, NAMED=named, ACCESS=access, SEQUENTIAL=sequential, DIRECT=direct, FORM=form, FORMATTED=formatted, UNFORMATTED=unformatted, RECL=recl)
INQUIRE 指令参数如下:
- FILE=filename: 返回相应的文件名
- EXIST=exist: 返回文件是否存在
- OPENED=opened: 返回文件是否已被打开
- NAMED=named: 返回文件是否取名字了
- ACCESS=access : 返回文件的访问方式
- DIRECT=direct: 查看文件是否是采用了直接读写方式
- SEQUENTIAL=sequential: 查看文件是否是采用了顺序读写方式
- FORM=form: 返回文件的保存方式,二进制还是文本
- ......
其他文件运行命令
- BACKSPACE:把文件读写位置退回一步
- ENDFILE:把文件读写位置编程文件结尾
- REWIND:把文件读写位置倒回文件开头
- CLOSE:把文件关闭,不再进行读写操作
NAMELIST
NAMELIST 文件必须以 EOF (lf, crlf)结尾,NAMELIST 文件后缀名通常为
.nml
不过实际上任何文本文件后缀名均可,通常也可用.txt
代替。
NAMELIST 调用举例:
Fortran
program main
implicit none
integer :: a = 1, b = 2, c = 3
logical :: d = .true.
namelist /na/ a, b, c, d
write(*, nml=na)
end program main
对应 NAMELIST 文件如下:
txt
&NA
A= 1,
B= 2,
C= 3,
D= T,
/
- 在输入的 Namelist 中,可以缺少某些变量,但不能有未定义的变量
- 一个文件中可以包含多个 namelist 变量的输入设置
- 在输入的 namelist 中,逻辑变量的值可以写成 “T”、“F”,也可以是 “.true.” 和 “.false.”
- 在输入的 Namelist 中,字符串需要带上引号
gfortran 对应 namelist 格式如下:
```txt
&NA
A= 1,
B= 2,
C= 3,
D= 3*5 ,
E=T,
F= 1.1100000000000001 ,
G= 1, 3, 5,
STR="hello ",
/
ifort 对应 namelist 格式如下:
txt
&NA
A = 1,
B = 2,
C = 3,
D = 3*5,
E = T,
F = 1.11000000000000 ,
G = 1, 3, 5,
STR = hello
/
使用 gfortran 编译 ifort 格式时会报错,建议采用 gfortran 格式,或者使用 --free-form
参数编译。