Если не используется новый потоковый доступ, доступный в F2003, Fortran классически рассматривает файлы как последовательность записей. Если файл подключен для прямого доступа, можно получить доступ к любой записи в любом порядке, указав номер записи. Например:
open(newunit=funit, file=filename, form='unformatted', access='direct', &
recl=64, status='old')
read(funit, rec=2) data
close(funit)
Так что это звучит великолепно... однако я не уверен, что понимаю параметр RECL и как можно эффективно использовать прямой доступ, если правильная длина записи еще не известна. Из документов (различные версии Intel Fortran):
Все записи имеют длину, указанную параметром RECL в операторе OPEN.
Другими словами, прямой доступ разрешает доступ к данным в объеме, равном или меньше RECL, при перемещении по файлу с шагом RECL. То есть вы можете указать любое значение, которое вам нравится (равное или меньше размера файла, я полагаю). Я думаю, это очевидно задним числом... но я надеялся, что соответствующий RECL каким-то образом можно обнаружить.1 Возможно, я делаю это неправильно, но я хотел бы получить данные из указанного только запись - не больше, не меньше.
Помимо кодирования соответствующего значения RECL
в разделе «заголовок» файла, есть ли способ получить доступ к одной записи за раз с файлом, подключенным для неформатированного (или даже отформатированного) прямого доступа, если правильная длина записи не известно заранее? Какие хитрости для этого используются?
1 Я надеялся, что inquire(funit, recl=rl)
предоставит соответствующий RECL, но если файл был подключен для прямого доступа, он возвращает значение RECL, указанное при открытии файла. При подключении для последовательного доступа кажется, что он возвращает максимально допустимую длину записи (?), 2040 в моем случае.
rl
действительно соответствует максимальной длине записи. - person francescalus   schedule 10.05.2017RECL
как вы узнаете, что файл вообще был записан с фиксированной длиной записи? Кажется, это тот случай, когда вы должны лучше объяснить, что вы на самом деле пытаетесь сделать. - person agentp   schedule 10.05.2017