Skip to content

文件系统

目录

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 参数编译。

基于 CC BY-NC-SA 4.0 许可发布