3

我有一个从文件中打开和读取数据开始的 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

4 回答 4

6

我会IOSTAT按照@Fortranner 的说明使用。我还会在尝试打开文件之前设置默认值,而且我倾向于不使用 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
于 2013-06-14T15:17:06.193 回答
3

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

于 2013-06-14T16:27:28.713 回答
0

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

于 2013-06-14T15:06:10.923 回答
0

There are two ways to do this. One is using IOSTAT specifier in the OPEN statement like Fortranner and Timothy Brown suggested. The other is to use the ERR specifier in the OPEN statement which lets you specify a label to which the program will transfer control in the even of an error:

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

The label must be in the same scoping unit as the OPEN statement.

于 2013-06-14T15:20:09.823 回答