сохранение позиции файла и возврат в фортран 90 - PullRequest
2 голосов
/ 19 ноября 2011

Я редактирую фортран 90, чтобы прочитать файл.Конкретный файл «загрязнен» некоторой дополнительной информацией, поэтому я хотел попробовать прочитать, а затем перемотать назад;перечитайте, если по ошибке:

open(filenum,file=filename,form="unformatted",iostat=ierr) //'direct' access
...lots of stuff...
here = ftell(filenum)
read(filenum,iostat=ierr) var1, var2             //try reading as var1, var2
if(iswrong(var1, var2)) then                     //check if correct
  call fseek(filenum,here-ftell(filenum),1)      //rewind
  read(filenum,iostat=ierr) vara, varb, varc     //read as different type 
endif

Однако, когда я компилирую эту программу, я получаю

Undefined symbols:
  "_fseek_", referenced from:
      ___myreader__subroutine_name in myreader.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

(я пытаюсь скомпилировать на gfortran (i686-apple-darwin8-gfortran-4,2)).Я понимаю, что fseek - это не стандартная рутина Фортрана.

Интересно, есть ли альтернатива?Я понимаю, что могу сделать что-то вроде read(filenum,rec=somevalue), но как я могу использовать это подобным образом?Я также подумал о том, чтобы попытаться прочитать с помощью read(,advance='no') для тестирования, а затем снова прочитать с помощью advance='yes', если он находится в правильном формате, но для этого требуется специальное выражение формата, которое не указано.Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 ноября 2011

Вы должны использовать клавишу Backspace, чтобы вернуться к предыдущей записи.Традиционный Fortran IO основан на записях, не на потоковой основе (как в C)

1 голос
/ 19 ноября 2011

Существует другой метод обработки ввода, если вы не уверены в содержимом файла - в этом случае иногда содержимое файла неверно или отличается - это чтение в строку, а затем проверка содержимого строки.Если содержимое допустимо, вы можете использовать оператор read для чтения из строки.Или, если содержимое «другое», используйте другое выражение для чтения или выполните соответствующее действие.Нет перемотки или возврата не требуется.Вы должны угадать самую длинную длину строки, чтобы объявить длину строки.

1 голос
/ 19 ноября 2011

В Linux и Windows в целом нормально вычислять смещения поиска.

Однако в ориентированных на запись файловых системах (OpenVMS, OS / 370, NOS и т. Д.), Значение которых исходит изftell() - это магический файл cookie, и его нельзя проверить или обработать с помощью тривиальной арифметики для вычисления нового местоположения файла.Вместо этого используйте оператор rewind, чтобы вернуться к началу файла (если он действительно доступен для поиска).

...