2017-01-09 10 views
1

В программе я улучшаю, я заметил, что 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 

ответ

2

Здесь есть две проблемы. Давайте посмотрим на них отдельно.

Сначала рассмотрим

open(unit=nhist,file=history,iostat=ierr) 

Комментарий предполагает, что ierr всегда устанавливается равным нулю. Ну, почему не должен быть установлен на ноль? ierr должен быть ненулевым в случае ошибки, но есть ли файл, не имеющий ошибки?

Не обязательно. В отсутствие спецификатора status= принимается значение по умолчанию status='unknown'. Компилятор не должен (и вряд ли) рассматривать открытие в этом случае как ошибку, если файл не существует. Вероятно, это создаст его по мере необходимости при записи или жалуется при чтении.

Добавление status='old' к заявлению open - это обычный способ сказать, что «файл должен существовать».

Во-вторых, рассмотрим

 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 :(" 

Некоторые утверждают, что это даже лучше, чем status='old' в заявлении open.

+0

Дорогой Франческалюс, большое вам спасибо! Да. Он работает, когда я добавляю 'status = old'. – Leon

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

  • Нет связанных вопросов^_^