文件输入/输出#

在 Fortran 中,文件由单元标识符管理。与文件系统的交互主要通过 openinquire 内置程序进行。通常,工作流程是打开一个文件到一个单元标识符,读取和/或写入它,然后再次关闭它。

integer :: io
open(newunit=io, file="log.txt")
! ...
close(io)

默认情况下,如果文件不存在,则将创建该文件并打开以供读取和写入。写入现有文件将从第一条记录(行)开始,因此默认情况下会覆盖该文件。

要创建对文件的只读访问权限,必须使用指定的 statusaction

integer :: io
open(newunit=io, file="log.txt", status="old", action="read")
read(io, *) a, b
close(io)

如果文件不存在,则会发生运行时错误。要在打开文件之前检查文件是否存在,可以使用 inquire 函数

logical :: exists
inquire(file="log.txt", exist=exists)
if (exists) then
  ! ...
end if

或者,open 过程可以返回可选的 iostatiomsg

integer :: io, stat
character(len=512) :: msg
open(newunit=io, file="log.txt", status="old", action="read", &
  iostat=stat, iomsg=msg)
if (stat /= 0) then
  print *, trim(msg)
end if

请注意,iomsg 需要一个具有足够存储大小的固定长度字符变量来保存错误消息。

同样,通过使用 statusaction 关键字写入文件。要创建一个新文件,请使用

integer :: io
open(newunit=io, file="log.txt", status="new", action="write")
write(io, *) a, b
close(io)

或者,status="replace" 可用于覆盖现有文件。强烈建议在决定要使用的_status_ 之前先检查文件是否存在。要附加到输出文件,可以使用显式指定 position 关键字

integer :: io
open(newunit=io, file="log.txt", position="append", &
  & status="old", action="write")
write(io, *) size(v)
write(io, *) v(:)
close(io)

要重置文件中的位置,可以使用内置程序rewindbackspacerewind 将重置到第一条记录(行),而 backspace 将返回到上一条记录(行)。

最后,要删除文件,必须打开文件,并且可以在关闭后删除

logical :: exists
integer :: io, stat
inquire(file="log.txt", exist=exists)
if (exists) then
  open(file="log.txt", newunit=io, iostat=stat)
  if (stat == 0) close(io, status="delete", iostat=stat)
end if

一个有用的 IO 功能是暂存文件,可以使用 status="scratch" 打开。它们在关闭单元标识符后自动删除。