我有一个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
答案 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
语句位于同一范围内。