Здесь есть две проблемы. Давайте посмотрим на них отдельно.
Сначала рассмотрим
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
.
Дорогой Франческалюс, большое вам спасибо! Да. Он работает, когда я добавляю 'status = old'. – Leon