next up previous contents
След.: Упражнения Выше: Ввод и вывод Пред.: Закрытие файла   Содержание


Чтение и запись

Оператор чтения один: READ; операторов записи два: WRITE и PRINT. Их синтаксис таков:

READ ( управляющие спецификаторы ) [ список ввода ]

READ формат [ список ввода ]

WRITE ( управляющие спецификаторы ) [ список вывода ]

PRINT формат [ , список вывода ]

Оператор PRINT осуществляет вывод на стандартное устройство вывода; ввод со стандартного устройства возможен с помощью второй формы оператора READ. Отметим, что стандартное устройство ввода присоединено только на первом образе; если есть настоятельная необходимость в нем на других образах, следует подключать его явным образом. Устройства стандартного вывода и потока ошибок подключены на всех образах.

Список ввода или вывода -- это перечисление идентификаторов данных (скаляров и массивов, возможны и производные типы) через запятую. Каждый элемент списка обрабатывается и передается устройству (из устройства) до последующего; например [14],

READ (N) N, X (N)

в этом операторе исходное значение переменной N определяет устройство, затем новое значение читается из файла и служит индексом массива X.

Опишем спецификаторы. Обязательным (для WRITE, у оператора READ он может быть опущен, что означает чтение со стандартного ввода) является спецификатор UNIT. Имя может быть опущено и тогда спецификатор идет первым в списке.

Для форматных файлов обязателен также спецификатор FMT, определяющий формат; формат определяет текстовое представление числовых и иных данных. Символы FMT= могут быть опущены, но тогда значение идет вторым в списке спецификаторов (первым, если у оператора READ опущен спецификатор UNIT). Формат указывается одним из трех способов: строковым выражением, описывающей формат; меткой (целое положительное число), определяющей строку, содержащую строковое выражение, описывающее формат (это удобно, если формат громоздок, а также стилистически бывает удобно собрать форматы в одном месте программы); символом *, означающим формат по умолчанию (определяемым данными) -- во многих случаях его совершенно достаточно. Вместо спецификатора FMT может присутствовать спецификатор NML, указывающий имя списка ввода/вывода; имя спецификатора также может быть опущено, но тогда значение идет вторым; путаницы быть не может, так как имя списка (без кавычек) не может быть спутано с описанием формата (строка), символом * или целым числом -- меткой. Списки ввода/вывода определяются оператором NAMELIST9.9).

ADVANCE
-- устанавливает, перемещать ли позицию на следующую запись при чтении или записи текущей записи. Возможные значения 'YES' (по умолчанию) и 'NO'. Вывод без смещения полезен, например, для вывода приглашения на консоль, причем курсор остается на той же строке. Однако отложенный до завершения записи вывод удовлетворяет Стандарту, так что эта схема может и не работать.

ASYNCHRONOUS
-- задает режим асинхронного ввода / вывода. Возможные значения: 'YES' и 'NO' (по умолчанию). Возможен только для внешних файлов, открытых для асинхронного ввода / вывода. Процессор может осуществлять асинхронную передачу данных асинхронно, но не обязан делать это. В любом случае порядок записей при асинхронной передаче такой же, как и при синхронной.

BLANK, DECIMAL, DELIM, PAD, ROUND, SIGN
-- отменяют соответствующий режим по умолчанию, заданный при открытии файла одноименными спецификаторами оператора OPEN, и устанавливают другой режим.

ID
-- задает переменную целого типа, в которую записывается некоторое значение в случае успешного выполнения операции асинхронного ввода/вывода. Нулевое значение свидетельствует о том, что операция завершена. Ненулевое значение (оно уникально для каждой операции на данном устройстве, согласно требованиям стандарта) служит идентификатором отложенной операции ввода/вывода, который можно передавать операторам WAIT и INQUIRE.

END и EOR
-- задают метку строки, на которую следует перейти в ситуации «конец файла» и «конец записи» соответственно. EOR требует спецификатор ADVANCE со значением 'NO'.

ERR, IOSTAT, IOMSG
-- аналогичны одноименным спецификаторам оператора открытия файла OPEN.

POS
-- указывает позицию в потоковом файле, является положительным целым числом, измеряется в единицах хранения. Напомним, что не все натуральные числа описывают корректные позиции; заведомо корректна единица как начало файла, остальные позиции можно определить с помощью оператора INQUIRE.

REC
-- указывает номер записи для файлов прямого доступа (положительное целое число). Для файлов форматного и потокового доступа не применяется.

SIZE
-- задает целую переменную, которой присваивается число введенных символов при синхронном вводе (при асинхронном -- по завершении соответствующей ситуации ожидания). Требует спецификатор ADVANCE со значением 'NO'.

Если говорить упрощенно, то для форматного ввода/вывода обязательно указываются устройство и формат (и то, и другое может быть по умолчанию, то есть символ *), а для прямого ввода/вывода указываются устройство и номер записи. Примеры:

WRITE (*,*) 'HELLO, WORLD!' !вывод на экран

То же самое:

PRINT*, 'HELLO, WORLD!

Запись параметров:

OPEN(UNIT=1, FILE='params.dat')

WRITE (1,*) 'Параметры:', D, T, V0

Чтение текстовых данных, формат по умолчанию

READ (1,*) S, D, T, V0

Переменные, разумеется, объявлены и определены ранее.

Чтение из файла прямого доступа:

OPEN(3,FILE='data.dat',FORM='unformatted',&

&ACCESS='direct',RECL=(mn*2+4),STATUS='old')

READ(3,REC=n) n,P,delta

Запись в файл прямого доступа:

OPEN (UNIT=5,FILE=name,STATUS='new',&

&ACCESS='direct',FORM='unformatted',RECL=nnn)

WRITE(5,rec=1) u

WRITE(5,rec=1) v

WRITE(5,rec=1) w



Подсекции

Ilya A. Chernov 2012-12-19
X