文件不存在时的异常处理

时间:2013-06-14 14:33:17

标签: fortran

我有一个Fortran程序,它从打开和读取.txt文件中的数据开始。 在程序结束时,将写入一个新文件,该文件将替换旧文件(最初导入的文件)。

但是,可能会出现需要打开的文件不存在的情况,因此,应从.txt文件导入的变量应为0

我想通过以下代码执行此操作,但是这不起作用,并且当文件history.txt不存在时脚本将中止。

history.txt文件不存在时,如何让脚本为我的变量设置默认值?

  OPEN(UNIT=in_his,FILE="C:\temp\history.txt",ACTION="read")
  if (stat .ne. 0) then    !In case history.txt cannot be opened (iteration 1)
    write(*,*) "history.txt cannot be opened"
    KAPPAI=0
    KAPPASH=0
    go to 99
  end if
  read (in_his, *) a, b
  KAPPAI=a
  KAPPASH=b
  write (*, *) "KAPPAI=", a, "KAPPASH=", b
  99   close(in_his)  

导入的文件非常简单,如下所示:

  9.900000000000006E-003  3.960000000000003E-003

4 个答案:

答案 0 :(得分:6)

我会使用@Fortranner所述的IOSTAT。在尝试打开文件之前我也会设置默认值,而我倾向于不使用goto。如:

program test

    implicit none
    integer :: in_his, stat
    real :: KAPPAI, KAPPASH

    in_his  = 7
    KAPPAI  = 0
    KAPPASH = 0

    OPEN(UNIT=in_his, FILE="history.txt",ACTION='read',IOSTAT=stat,STATUS='OLD')
    if (stat .ne. 0) then
            write(*,*) "history.txt cannot be opened"
            stop 1
    end if

    read (in_his, *) KAPPAI, KAPPASH
    close(in_his)

    write (*, *) "KAPPAI=", KAPPAI, "KAPPASH=", KAPPASH

end program test

答案 1 :(得分:2)

另一种方法是使用inquire语句并在尝试打开文件之前检查文件是否存在。这将设置一个逻辑变量,可以在IF语句中用于处理这两种情况:1)打开文件和读取值,或2)设置默认值,无需打开文件。或者先设置默认值,然后让IF语句只处理打开文件和读取值的情况。

答案 2 :(得分:0)

在open语句中设置iostat并处理非零的情况。

答案 3 :(得分:0)

有两种方法可以做到这一点。一个是在IOSTAT语句中使用OPEN说明符,如Fortranner和Timothy Brown建议的那样。另一种是使用ERR语句中的OPEN说明符,它允许您指定程序将在错误中转移控制的标签:

OPEN(UNIT=in_his,FILE="C:\temp\history.txt",ACTION="read",STATUS='OLD',ERR=101)
...
101 CONTINUE

标签必须与OPEN语句位于同一范围内。