Чтобы последовательно прочитать запись в Fortran 95, используйте ввод без продвижения. Например:
CHARACTER(10) :: buffer
INTEGER :: size
READ (unit, "(A)", ADVANCE='NO', SIZE=size, EOR=10, END=20) buffer
будет считывать до 10 символов (длина буфера) при каждом вызове. Позиция в файле будет переходить к следующей записи (следующей строке) только после того, как вся запись будет прочитана серией из одного или нескольких непереходных чтений.
За исключением условия конца файла, переменная size
будет определяться с фактическим количеством символов, считываемых в buffer
каждый раз, когда выполняется оператор чтения.
Спецификаторы EOR
и END
и используются для управления потоком выполнения (выполнение переходит к оператору с соответствующей меткой), когда возникают условия конца записи или конца файла соответственно. Вы также можете использовать спецификатор IOSTAT
для обнаружения этих условий, но конкретные отрицательные значения, используемые для двух условий, зависят от процессора.
Вы можете суммировать size
внутри конкретной записи, чтобы вычислить длину этой конкретной записи.
Оберните такое чтение без продвижения в цикле, который правильно определяет конец файла и конец записи, и вы получите часть добавочного чтения.
В Fortran 95 спецификация длины для локальной символьной переменной должна быть выражением спецификации — по сути, выражением, которое можно безопасно вычислить до первого исполняемого оператора области, содержащего объявление переменной. Константы представляют собой простейший случай, но выражение спецификации в процедуре может включать, среди прочего, фиктивные аргументы этой процедуры.
Чтение всей записи произвольной длины представляет собой многоэтапный процесс:
- Определите длину текущей записи, используя серию добавочных чтений. Эти добавочные чтения для конкретной записи заканчиваются, когда возникает условие конца записи, когда позиция в файле перемещается к следующей записи.
Backspace
файл обратно к интересующей записи.
- Вызвать процедуру, передав длину текущей записи в качестве фиктивного аргумента. Внутри этой процедуры есть символьная переменная, длина которой определяется фиктивным аргументом.
- Внутри этой вызываемой процедуры считывайте текущую запись в эту символьную переменную, используя обычный опережающий ввод.
- Выполните дальнейшую обработку этой символьной переменной!
Обратите внимание, что каждая запись в конечном итоге считывается дважды: один раз для определения ее длины, а второй — для фактического чтения данных в правильно «длинную» символьную переменную.
Существуют альтернативные подходы, в которых используются выделяемые (или автоматические) массивы символов единичной длины. Общая стратегия та же. В качестве примера посмотрите на код процедур Get в общей реализации ISO_VARYING_STRING.
В Фортране 2003 представлены символьные переменные с отложенной длиной, длина которых может быть указана произвольным выражением в операторе распределения или, для размещаемых переменных, длиной правой части оператора присваивания. Это (в сочетании с другими «распределяемыми» улучшениями) позволяет прогрессивному чтению, которое определяет длину записи, также создавать символьную переменную, которая содержит содержимое записи. Вашему руководителю необходимо обновить свою среду Fortran.
person
IanH
schedule
08.02.2013