сохранение позиции файла и возврат в фортран 90

Я редактирую фортран 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', если он в правильном формате, но для этого требуется определенное выражение формата, которое не указано. Спасибо.


person hatmatrix    schedule 18.11.2011    source источник
comment
Откуда вы получаете ftell и fseek? Похоже, вы на самом деле хотели бы выполнять потоковый ввод-вывод вместо прямого ввода-вывода...   -  person haraldkl    schedule 19.11.2011
comment
Спасибо, @haraldkl, я понял это здесь и в других местах... если бы я прочитал операторы меняются, если я использую потоковый ввод-вывод вместо прямого? Это большая программа, которую я не писал, поэтому я думаю, что мне будет трудно найти и изменить остальную часть программы.   -  person hatmatrix    schedule 19.11.2011
comment
Вы забыли вызов, в документации gfortran, на которую вы ссылались, говорится, что это подпрограмма, а не функция, поэтому требуется вызов. Stream IO будет немного другим, но переносимым на другие компиляторы.   -  person haraldkl    schedule 19.11.2011
comment
Ах, прости! В моем фактическом коде есть оператор вызова. Я подчищал это перед публикацией и случайно вырезал... Я отредактирую пост - спасибо, что указали на это.   -  person hatmatrix    schedule 19.11.2011
comment
Ах, если я напишу оригинальный код на Фортране, я буду помнить об этом. Увы, это часть чего-то большего, доставшегося мне по наследству, так что, боюсь, это не мой выбор.   -  person hatmatrix    schedule 19.11.2011


Ответы (3)


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

person Stefano Borini    schedule 18.11.2011

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

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

person wallyk    schedule 18.11.2011
comment
Спасибо за понимание ftell - я думал, что это целое число позиции (например, точка в буфере emacs...). Я думаю, что rewind работает, но не может вернуться к началу, хотя это большой файл, необходимый только для возврата на несколько записей... - person hatmatrix; 19.11.2011

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

person M. S. B.    schedule 19.11.2011
comment
Ах, что-то вроде sscanf с фортраном... да... к сожалению, это двоичный файл, не отформатированный на фортране, так что этот тип операции будет немного сложнее... - person hatmatrix; 21.11.2011