Дата публикации: Aug 16, 2013 6:55:10 PM
Ввод и вывод в Фортране делится на форматный и неформатный, а файлы бывают последовательного доступа, прямого доступа и потоковые. Итого получается шесть режимов ввода/вывода. При форматном вводе/выводе данные преобразуются из/в внутреннего представления в/из текстовое; при неформатном - читаются и записываются во внутреннем представлении (может быть разница между формой хранения в памяти и на диске, но это несущественно). В файлах последовательного доступа записи, форматные или неформатные, доступны по очереди, как на ленте. И есть процедуры перемотки - к концу, к началу, вперед, и т.п. Типичен форматный последовательный доступ - строки в файле - это записи, они и пишутся по очереди, и читаются. Файлы прямого доступа имеют записи одинаковой длины и они доступны по номеру. Типичен неформатный прямой ввод/вывод - двоичные данные пишутся или читаются "порциями" по номеру, причем в любом порядке - можно даже с конца. Причем читать можно только ранее записанные записи (что естественно), причем файл при этом должен быть доступен для чтения. Записи нельзя удалить, но можно перезаписать. Потоковые файлы похожи на файлы прямого доступа, но вместо записей - единицы хранения (байты или четырехбайтные единицы - вещественные числа либо символы). Потоковый неформатный доступ фактически совпадает с прямым при записи единичной длины (с той разницей, что вместо номера записи используется позиция, спецификатор POS).
Рассмотрим подробнее прямой неформатный доступ.
Файл прямого доступа открывается оператором OPEN, как всегда. Спецификатор ACCESS имеет значение DIRECT, что и означает прямой доступ. Необходим спецификатор RECL, задающий длину записи в единицах хранения. Спецификатор FORM по умолчанию UNFORMATTED, так что может быть опущен. Длина записи задается в единицах хранения, которая может равняться байту (GNU Fortran) или 4 байтам (размер вещественного и целого типа по умолчанию, например, Intel Fortran), а может иметь и иное значение. Размер записи в точности соответствует суммарному размеру записываемых либо читаемых данных. Так, в Intel Fortran запись массива 50х50 вещественных (REAL) чисел имеет RECL 2500, а чисел двойной точности - 5000.
Есть возможность задавать RECL вручную, но для переносимости приходится определять глобальную константу с размером переменной данного типа в единицах хранения. Переносимый способ, к тому же более удобный, особенно в случае составных типов и объектов (ООП), основан на операторе INQUIRE с спецификатором IOLENGTH. Он имеет вид INQUIRE(IOLENGTH = int) список,
где список - это перечисление объектов, подлежащих вводу и выводу, а int - имя переменной целого типа, в которую и будет помещено значение длины записи в единицах хранения, необходимой для записи (или чтения) данного списка в (из) файл.
Для чтения и записи используются операторы READ и WRITE, причем обязателен спецификатор REC, задающий номер записи. Например:
INQUIRE(IOLENGTH=Tiol) T
OPEN(3, FILE='TS.dat', RECL = Tiol)
WRITE(3,REC=1) T
WRITE(3,REC=2) S
CLOSE(3)