无法检测文件是否存在
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'
更好。
在我正在改进的一个程序中,我注意到 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'
更好。