2013-06-14 4 views
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 

ответ

0

Set IOSTAT в открытом заявлении и обрабатывает случай, когда она отлична от нуля.

6

Я бы использовал IOSTAT, как указано @Fortranner. Я также установил значения по умолчанию, прежде чем пытаться открыть файл, и я склонен не использовать goto's. Как в:

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 
0

Есть два способа сделать это. Один использует спецификатор IOSTAT в заявлении OPEN, таком как Фортраннер и Тимоти Браун. Другой заключается в использовании ERR спецификатора в OPEN заявления, которое позволяет указать метку, на которую программа будет передавать управление в даже ошибках:

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

Метка должна находиться в том же блоке обзорного, что и OPEN заявление.

2

Другой способ - использовать инструкцию inquire и проверить наличие файла, прежде чем пытаться его открыть. Это установило бы логическую переменную, которая могла бы использоваться в инструкции IF для обработки двух случаев: 1) открыть файл и прочитать значения или 2) установить значения по умолчанию без открытия файла. Или сначала задайте значения по умолчанию, а затем оператор IF обрабатывает только случай открытия файла и чтения значений.

Смежные вопросы