2016-07-27 1 views
1

У меня есть небольшая проблема с чтением файла в Fortran. Как вы можете видеть, я перебираю файл, читающий определенные записи с определенной длиной.Ошибка ввода/вывода GFortran 5002 при чтении файла прямого доступа

Что происходит, когда дело доходит до определенной записи, я получаю сообщение об ошибке IOSTAT 5002. Теперь мой вопрос в том, что означает эта ошибка: это конец файла или нет записи влево или что-то еще? Могу ли я игнорировать это?

Я использую MinGW GFortran 4.8.0.

Вот код:

PROGRAM test_read 

INTEGER*4   HCM_error 
DOUBLE PRECISION N_Record(22) 
CHARACTER*8   C_Record(22) 

EQUIVALENCE   (N_Record,C_Record) 

OPEN (UNIT=11, FILE='C:/BORDER/D__HOL.000',STATUS='OLD', ACCESS='DIRECT',RECL=176, ACTION='READ', IOSTAT=IOS) 

HCM_error=0 

DO N_rec = 1, 2000 
    READ (11, REC=N_rec, IOSTAT=IOS) C_Record 

    WRITE(*,*) "|",IOS,' ',N_rec,' ',N_record(21),' ',N_record(22),"|" 

    !End of file reached (or non existing record) ? 
    IF ((IOS .LT. 0) .OR. (IOS .EQ. 36)) EXIT 

    IF (IOS .NE. 0) THEN 
     !Error in (border-) line data 
     HCM_Error = 1049 
     EXIT 
    END IF 
END DO 

CLOSE(UNIT=11) 

WRITE (*,*) HCM_error 
END PROGRAM 
+0

Вы имеете в виду, что значение 'ios' равно 5002? – francescalus

+0

Да, значение ios равно 5002. – Ramirez

+0

Я пробовал использовать IOMSG =, и он говорит о несуществующем номере записи. – Ramirez

ответ

2

Значение ненулевое возвращаемое iostat= спецификатора не переносимы между компиляторами. Если вы хотите, чтобы определить, какой конкретный код означает, то у вас есть два варианта:

  • чтения документации компилятора (если он существует)
  • использовать iomsg= спецификатор с характером переменной

В этом Если вы попробовали iomsg=, у вас появилось сообщение «Несуществующий номер записи». Итак, проблема решена.

Ну, почти. Есть еще что сказать.

Вы можете быть удивлены тем, что вы проходите записи по очереди в прямом доступе, но достигаете состояния «без записи», не достигнув сначала состояния «конца файла». Вы тестируете (IOS .LT. 0) с комментарием «Достигнут конец файла».

При чтении файла, подключенного для прямого доступа, условие окончания файла не возникает.

Что вы можете сделать, чтобы обнаружить, что запись не является допустимым числом, за пределами файла? Не много, портативно, но любое положительное число от iostat= указывает на состояние ошибки. Знаешь, теперь, что это означает 5002.


я, вероятно, следует также добавить, что символьная переменная для iomsg= определяется утверждением передачи, только если не успех. Учитывайте это, только если вы знаете, что передача не удалась.

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