无法检测文件是否存在

Cannot detect file existing or not

在我正在改进的一个程序中,我注意到 Fortran 不检测文件是否存在。这导致了一个尚未修复的逻辑错误。如果您能指出问题或错误并给予更正,我将不胜感激。

  open(unit=nhist,file=history,iostat=ierr)!This setting cannot exit program if file does not exist because ierr is always 0
  if (ierr /=0) then
   write(*,*)'!!! error#',ierr,'- Dump file not found'
   stop
  endif

  !I used below statement, the program exits even though a file is existing
       open(unit=nhist,file=history,err=700)
   700 ierr=-1
       if (ierr /=0) then
       write(*,*)'!!! error#',ierr,'- Dump file not found'
       stop
       endif

这里有两个截然不同的问题。我们分别来看一下。

首先考虑

open(unit=nhist,file=history,iostat=ierr)

注释表明 ierr 始终设置为零。那么,为什么不应该将它设置为零呢? ierr在错误的情况下应该是非零的,但是文件不存在是不是错误?

不一定。如果没有 status= 说明符,则采用默认的 status='unknown'。如果文件不存在,编译器不必(也不太可能)将这种情况下的打开视为错误。它可能会在写入时根据需要创建它,或者在尝试读取时抱怨。

open语句中加上status='old'就是通常的说法"the file should exist".

二、考虑

       open(unit=nhist,file=history,err=700)
   700 ierr=-1
       if (ierr /=0) then
       ...

如果这里有错误,执行将转移到标记为700的语句。从这条语句 ierr 设置为非零值,然后我们转到 if 构造来处理该错误。

只是标记为700的语句即使没有错误也恰好执行了:它只是open之后的下一条语句并且没有分支可以错过它。 [我可以举一个这种分支的例子,但我不想鼓励在现代代码中使用 err=。有了工作 iostat= 事情就更可取了。]

但是如果你只是想测试一个文件是否存在,考虑按文件查询:

logical itexists
inquire (file=history, exist=itexists)
if (.not.itexists) error stop "No file :("

有些人认为这比在 open 语句中包含 status='old' 更好。