Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Ввод и вывод данных ( Input and Output of Data )



Ввод и вывод данных ( Input and Output of Data )

Введение

Правильно организовать ввод-вывод в программах не менее важно, чем корректно составить алгоритм и закодировать его средствами языка. В этом разделе мы рассмотрим основные методы и средства ввода-вывода в ФОРТРАН-программах.

Прежде всего, следует помнить, что есть собственно программа и есть ”окружающая среда” или внешние устройства ввода-вывода ( УВВ ): видеомонитор, клавиатура, принтер, гибкий и жесткий диски, и т.п., с которыми эта программа общается. Контакт программы с УВВ происходит по так называемым каналам, которые можно открывать и закрывать в программе, то есть подключать или отключать УВВ. Канал идентифицируется своим номером, а УВВ – именем и способом доступа к нему (например, если УВВ – диск, то указывается имя файла и способ его организации: последовательный, прямой и т.д.). Программа может иметь несколько одновременно открытых каналов. Если представить программу в виде спрута, то каждая его нога (или рука? ) есть канал, которым он может “уцепиться” за разные УВВ. Существуют программные средства, которые позволяют сначала “пощупать” УВВ, прежде чем за него хвататься (открывать), и выяснить, доступно ли оно, в каком состоянии находится и т.д.

Далее будем использовать следующие понятия и сокращения:

· ввод или вывод данных ‑ ВВ;

· устройство ввода или вывода данных ‑ УВВ;

· позиционирование файла (установка файла) ‑ это расположение считывающего или записывающего устройства (магнитной головки диска, стриммера и т.д.) по отношению к файлу;

· список объектов (переменных), в которые передаются данные из УВВ при считывании или из которых передаются данные в УВВ при записи ‑ СВВ (список ввода или вывода).

 

Основные понятия

В этом разделе обсуждается система организации файлов и устройств ввода и вывода в Fortran. В следующих разделах дано описание операторов ввода и вывода и редактирования данных при вводе и выводе.

Файлы и УВВ предназначены для хранения и передачи данных, редактирование данных определяет их организацию при считывании и записи, а операторы ввода и вывода определяют, какие операции ввода и вывода выполняются с данными.

 

Файлы и устройства ввода и вывода ( Files and Devices )

В Fortran данные хранятся и передаются через файлы. Все источники и получатели данных рассматриваются как файлы. УВВ, такие как монитор, клавиатура или принтер, считаются внешними файлами, такими же как и файлы данных на диске.

Переменные, хранящиеся в оперативной памяти, могут рассматриваться также как и файлы на диске и обычно используются для преобразования чисел в символьные данные и обратно. Такие переменные называются внутренними файлами.

Все файлы состоят из записей. Запись может быть строкой экрана или логической записью файла на магнитной ленте или диске. Записи одного файла имеют одинаковый тип.

Количество байтов данных, занесенных в запись, должно быть меньше или равно длине записи. Неформатные операторы READ и WRITE передают одну запись. Форматные операторы READ и WRITE могут передавать более одной записи при использовании дескриптора формата слэш ( / ). Двоичные файлы в Fortran передают столько записей, сколько нужно для передачи требуемого количества байтов. При выводе, незавершенная форматная запись дополняется пробелами, а неформатная или двоичная ‑ нулями.

Логические устройства ( Logical Devices )

Каждый файл, внутренний или внешний, считается логическим устройством. Такое логическое устройство идентифицируется спецификатором устройства в параметре ( UNIT= ) операторов ввода-вывода. Спецификатором устройства в случае внутреннего файла является имя символьной переменной. Спецификатором устройства для внешних файлов является или число, которое указывается в операторе OPEN и задает номер подсоединяемого устройства ( или иначе номер открываемого канала), или номер так называемого предварительно подсоединенного устройства (которые не нужно явно подсоединять) или звездочка (*). Открытый канал закрывается или неявно при завершении выполнения программы или явно оператором CLOSE.

Канал не может быть присоединен одновременно более чем к одному файлу, а файл не может быть открыт более чем по одному каналу. Если оператором OPEN открывается уже открытый файл, то должно быть какое-нибудь отличие в параметрах этих операторов.

Номер канала указывается во всех операторах ввода-вывода за исключением:

· оператора PRINT, который является укороченной формой оператора WRITE с параметром UNIT= 6 или *;

· укороченного оператора READ, который является частным видом полного оператора READ с параметром UNIT= 5 или *;

· оператора INQUIRE с параметром FILE=, а не UNIT=.

 

Внешние файлы (External Files)

Номер канала для внешнего файла должен быть или целым выражением в диапазоне от –32767 до 32768 или звездочкой ( * ). Следующий пример показывает открытие по каналу 10 внешнего файла UNDAMP.DAT и запись данных в него:

 

OPEN(UNIT = 10, FILE = 'undamp.dat')

WRITE(10, '(A\)') ' Undamped Motion: '

 

Канал звездочка задает ввод с клавиатуры и вывод на экран монитора, например:

 

WRITE(*, '(1X, A\)') ' Вывод на экран'

 

Fortran имеет 4 предварительно открытых канала:

 

Номер канала Назначение
* Всегда клавиатура или экран
Сначала клавиатура или экран
Сначала клавиатура
Сначала экран

 

Канал ( * ) не может быть переназначен оператором OPEN другим устройствам, а такая попытка приведет к ошибке компиляции. Каналы 0, 5 и 6 могут упоминаться в операторе OPEN. При явном закрытии каналов 0, 5 или 6, они автоматически переназначаются на свои стандартные устройства.

В следующем примере, сначала выполняется вывод по предварительно открытому каналу 6 (на экран), затем он пересоединяется к внешнему файлу и затем он снова пересоединяется к экрану:

 

REAL a, b

! Вывод на экран

WRITE(6, '('' This is unit 6'')')

! Пересоединение к файлу COSINES

OPEN(UNIT = 6, FILE = 'COSINES', STATUS = 'NEW')

DO a = 0.1, 6.3, 0.1

b = COS(a)

WRITE(6, 100) a, b! Запись в файл COSINES

FORMAT(F3.1, F5.2)

END DO

CLOSE (6)! Закрытие файла

! Вывод опять на экран

WRITE(6, ' ('' Cosines completed'')')

END

 

CHARACTER(10) str

INTEGER n1, n2, n3

CHARACTER(14) fname

INTEGER i

str = " 1 2 3"

! Управляемый списком READ

! Значения переменных равны: n1 = 1, n2 = 2, n3 = 3

READ(str, *) n1, n2, n3

i = 4

! Форматный WRITE

! Значение переменной fname = 'FM004.DAT'

WRITE (fname, 200) i

FORMAT ('FM', I3.3, '.DAT')


Организация файлов ( Structure of Files )

Обзор

DVF поддерживает два метода доступа к файлам: последовательный ( sequential ) и прямой ( direct ), и три типа структур файлов: форматные ( formatted ), неформатные ( unformatted ) и двоичные ( binary ). Таким образом, имеется шесть типов файлов:

 

· Последовательный форматный

· Прямой форматный

· Последовательный неформатный

· Прямой неформатный

· Последовательный двоичный

· Прямой двоичный

 

Форматные файлы ( Formatted Files )

Создание форматного файла производится путем его открытия с параметром FORM= 'FORMATTED' или опусканием параметра FORM при открытии последовательного файла.

Записи форматного файла хранятся в виде ASCII символов. Каждая запись заканчивается двумя ASCII символами: перевода каретки (carriage return ‑ CR) и перевода строки (line feed ‑ LF). Если требуется, чтобы данные могли быть просмотрены человеком (например, в текстовом редакторе) нужно использовать форматные файлы. Данные в неформатных и двоичных файлах представляются шестнадцатеричными символами.

 

Неформатные файлы ( Unformatted Files )

Создание неформатного файла производится путем его открытия с параметром FORM= 'UNFORMATTED' или опусканием параметра FORM при открытии файла прямого доступа.

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

WRITE(3, '(A, I3)') 'RECORD', 1

WRITE(3, '()')

WRITE(3, '(A11)') 'The 3rd One'

CLOSE(3)

END

 

CLOSE(3)

END

CHARACTER xyz(3)

INTEGER*4 idata(35)

DATA idata /35 * -1/, xyz /'x', 'y', 'z'/

* Открытие файла и запись 140 байтов данных:

* 128 байт (блок) + 12 байт = 140 для IDATA,

* 3 байта для XYZ.

OPEN(3, FILE='UFSEQ', FORM='UNFORMATTED')

WRITE(3) idata

WRITE(3) xyz

CLOSE(3)

END

 

CLOSE(3)

END

 

 

  Рис. 3.F. Структура прямого неформатного файла

 

INTEGER(1) bells(4)

CHARACTER*4 wys(3)

CHARACTER*4 cvar

DATA bells /4*7/

DATA cvar /' is '/, wys /'What', ' you', ' see'/

OPEN(3, FILE='BSEQ', FORM='BINARY')

WRITE(3) iwys, cvar

WRITE(3) 'what ', 'you get! '

WRITE(3) bells

CLOSE(3)

END

  Рис. 3.G. Структура последовательного двоичного файла

 

WRITE(3) 4, 5

WRITE(3, REC=4) 'pq'

CLOSE(3)

END

 

Устройства ввода и вывода

Стандартными устройствами ввода-вывода в DVF являются клавиатура (при вводе) и экран (при выводе). Для того, чтобы выполнить ввод или вывод на другие физические устройства, необходимо указать имя устройства, как имя файла.

Имена некоторых УВВ определяются в операционной системе, а имена других ‑ в DVF. В Табл. 3.A приведены имена УВВ. Если любое из этих имен указано с расширением, например, LINE1.TXT, то оно будет считаться именем файла, а не УВВ.

Табл. 3.A

Стандартные имена УВВ

Имя Описание
CON Экран (стандартный вывод)
PRN Принтер
COM1 Последовательный порт 1
COM2 Последовательный порт 2
COM3 Последовательный порт 3
COM4 Последовательный порт 4
LPT1 Параллельный порт 1
LPT2 Параллельный порт 2
LPT3 Параллельный порт 3
LPT4 Параллельный порт 4
NUL Устройство NULL. Игнорирует вывод и ввод
AUX Последовательный порт 1
LINE1 Последовательный порт 1
USER1 Стандартный вывод
ERR1 Стандартная ошибка

 

Пример

 

OPEN(UNIT = 4, FILE = 'PRN')

OPEN(UNIT = 7, FILE = 'COM2', ERR = 100)

 

Обзор

К операторам, предназначенным для организации ввода и вывода данных из/во внешние устройства ввода-вывода, относятся:

 

Оператор Назначение
BACKSPACE Устанавливает файл в начало предыдущей записи
CLOSE Освобождает ранее подключенное УВВ
ENDFILE Выводит в файл запись конец файла
INQUIRE Проводит опрос свойств УВВ или файлов
LOCKING Блокирует файл или запись прямого доступа
OPEN Связывает канал с внешним УВВ или файлом
PRINT Выводит (печатает) данные в файл или на экран
READ Передает данные из файла элементу списка ввода
REWIND Устанавливает файл в начало
WRITE Передает данные из элемента списка вывода в файл

Оператор BACKSPACE

BACKSPACE { unitspec |( [UNIT=] unitspec

[, ERR=errlabel] [, IOSTAT=iocheck ]] ) }

где

· параметры UNIT, ERR и IOSTAT являются ключевыми словами.

· unitspec - целое выражение, которое задает номер канала. Если канал не открыт, генерируется ошибка выполнения программы. Если UNIT= опущено, unitspec должен быть первым параметром;

· errlabel - метка исполняемого оператора в той же программной единице, которому передается управление в случае возникновения ошибки ВВ;

· iocheck - целая переменная, элемент массива или элемент, которому присваивается код завершения операции ВВ (0 - при отсутствии ошибки и номер ошибки, если она произошла);

· параметры UNIT, ERR и IOSTAT являются ключевыми словами.

 

Оператор BACKSPACE устанавливает файл в начало предыдущей записи, т.е. возвращается ровно на одну запись назад, исключая случаи, указанные в следующей таблице.

 

 

Случай Результат
Предыдущая запись отсутствует Действие отсутствует
Предыдущей является запись конец файла Файл устанавливается перед записью конец файла
Файл установлен внутри некоторой записи файл устанавливается в начало этой записи

 

Если параметр оператора BACKSPACE является выражением, которое вызывает функции, эти функции не должны содержать операторы ВВ и встроенную функцию EOF.

При отсутствии обоих параметров ERR=errlabel и IOSTAT=iocheck, возникновение любой ошибки ВВ приводит к прерыванию выполнения программы.

 

Пример

BACKSPACE 5

BACKSPACE (5)

BACKSPACE lunit

BACKSPACE (UNIT = lunit, ERR = 30, IOSTAT = ios)

 

Оператор CLOSE

 

CLOSE ( [UNIT=] unitspec [, ERR=errlabel] [, IOSTAT=iocheck] [, STATUS=status] )

где

· параметры UNIT, ERR, IOSTAT и STATUS являются ключевыми словами.

· unitspec - целое выражение, которое задает номер канала. Если канал не открыт, генерируется ошибка выполнения программы. Если UNIT= опущено, unitspec должен быть первым параметром;

· errlabel - метка исполняемого оператора в той же программной единице, которому передается управление в случае возникновения ошибки ВВ;

· iocheck - целая переменная, элемент массива или элемент, которому присваивается код завершения операции ВВ (0 - при отсутствии ошибки и номер ошибки, если она произошла);

· status - символьное выражение приводимое к строкам 'KEEP' или 'DELETE'. Файлы, открытые с атрибутом " SCRATCH" (рабочие или временные) имеют по умолчанию статус 'DELETE'. Задание STATUS='KEEP' таких файлов приводит к ошибке выполнения программы. Для всех остальных файлов принимается по умолчанию STATUS='KEEP'.

 

Оператор CLOSE отсоединяет (закрывает) канал от УВВ. Не обязательно явно закрывать файлы, поскольку при нормальном завершении программы происходит закрытие каждого файла в соответствии с его статусом.

Закрытие канала 0 автоматически пересоединяет его к клавиатуре и экрану, а закрытие каналов 5 и 6 пересоединяет их к клавиатуре и экрану, соответственно.

Попытка закрытия канала звездочка (*) приводит к ошибке компиляции. Если параметр оператора CLOSE является выражением, которое вызывает функции, эти функции не должны содержать операторы ВВ и встроенную функцию EOF.

 

Пример

CLOSE (7, STATUS = 'DELETE')

 

Оператор ENDFILE

 

ENDFILE { unitspec | ( [UNIT=] unitspec

[, ERR=errlabel] [, IOSTAT=iocheck] ) }

где

· параметры UNIT, ERR и IOSTAT являются ключевыми словами.

· unitspec - целое выражение, которое задает номер канала. Если канал unitspec не был открыт, генерируется ошибка выполнения программы. Если ключевое слово UNIT= опущено, unitspec должен быть первым параметром, иначе параметры могут идти в любом порядке;

· errlabel - метка исполняемого оператора, расположенного в той же программной единице, на который передается управление в случае возникновения ошибки;

· iocheck - переменная, элемент массива или структуры целого типа, которые будут содержать код завершения выполнения оператора ENDFILE (0 при нормальном завершении или код ошибки, в случае ее возникновения).

 

Оператор ENDFILE выводит запись конец файла по указанному каналу и позиционирует файл после этой записи. Дальнейший вывод данных по этому каналу невозможен до тех пор, пока не выполнены операторы BACKSPACE или REWIND.

Если ENDFILE применен к файлу прямого доступа, все записи в файле после записи конец файла теряются.

Если любой параметр оператора ENDFILE является выражением с вызовом функций, они не должны содержать операторов ВВ и встроенной функции EOF.

 

Пример

 

WRITE (6, *) x

ENDFILE 6

REWIND 6

READ (6, *) y

 

Оператор INQUIRE

 

INQUIRE ( { [UNIT=] unitspec | FILE=file } [, ACCESS=access]

[, BINARY=binary] [, BLANK=blank] [, BLOCKSIZE=blocksize]

[, DIRECT=direct] [, ERR=errlabel] [, EXIST=exist]

[, FORM=form] [, FORMATTED=formatted] [, IOSTAT=iocheck]

[, MODE=mode] [, NAME=name] [, NAMED=named]

[, NEXTREC=nextrec] [, NUMBER=num] [, OPENED=opened]

[, RECL=recl] [, SEQUENTIAL=seq] [, SHARE=share]

[, UNFORMATTED=unformatted] )

где

· параметры, набранные заглавными буквами являются ключевыми словами;

· unitspec - звездочка (в этом случае нельзя использовать параметр NUMBER= ) или целое выражение, которое задает номер канала. Если ключевое слово UNIT= опущено, unitspec должен быть первым параметром, иначе параметры могут идти в любом порядке. Одновременно может быть указан или параметр UNIT (при запросе свойств канала) или FILE (при запросе свойств файла);

· file - символьное выражение, которое интерпретируется как имя файла;

· access - переменная, элемент массива или структуры символьного типа. Возвращает значения 'SEQUENTIAL' или 'DIRECT' в зависимости от способа доступа к УВВ или файлу. Способ доступа неопределен, если запрашивается неприсоединенное устройство (неоткрытый канал);

· binary - переменная, элемент массива или структуры символьного типа. Возвращает 'YES' если УВВ или файл ‑ двоичные и 'NO' или 'UNKNOWN' в других случаях;

· blank - переменная, элемент массива или структуры символьного типа. Возвращает 'NULL' если установлен описатель BN и 'ZERO' если BZ;

· blocksize - переменная, элемент массива или структуры целого типа. Возвращает размер буфера ВВ если УВВ или файл уже открыты, иначе параметр неопределен;

· direct - переменная, элемент массива или структуры символьного типа. Возвращает 'YES' если установлен прямой способ доступа к УВВ или файлу, иначе ‑ 'NO' или 'UNKNOWN';

· errlabel - метка исполняемого оператора, расположенного в той же программной единице, на который передается управление в случае возникновения ошибки;

· exist - переменная, элемент массива или структуры логического типа. Возвращает.TRUE. если устройство или файл существуют, иначе ‑.FALSE. ;

· form - переменная или элемент массива символьного типа. Возвращает 'FORMATTED' (форматный) 'UNFORMATTED' (бесформатный) или 'BINARY' (двоичный) в зависимости от способа доступа к УВВ или файлу;

· formatted - переменная, элемент массива или структуры символьного типа. Возвращает 'YES' если установлен форматный доступ к УВВ или файлу, иначе 'NO' или 'UNKNOWN';

· iocheck - переменная, элемент массива или структуры целого типа, которые будут содержать код завершения выполнения оператора ENDFILE (0 при нормальном завершении или код ошибки, в случае ее возникновения);

· mode - переменная, элемент массива или структуры символьного типа. Возвращает значение установленной оператором OPEN моды (назначения) УВВ или файла: 'READ', 'WRITE' или 'READWRITE'. Значение неопределено при опросе УВВ и неприсоединенном файле;

· name - переменная, элемент массива или структуры символьного типа. Возвращает имя файла, подсоединенного к каналу. Значение неопределено при неприсоединенном файле;

· named - переменная, элемент массива или структуры логического типа. Возвращает.FALSE. если файл неприсоединен или является временным, иначе ‑.TRUE. ;

· nextrec - переменная, элемент массива или структуры целого типа. Возвращает номер следующей записи для файлов прямого доступа;

· num - переменная, элемент массива или структуры целого типа. При опросе файла возвращает номер канала;

· opened - переменная, элемент массива или структуры логического типа. При опросе канала возвращает.TRUE. если файл подсоединен, иначе ‑.FALSE.. При опросе файла возвращает.TRUE. если файл уже присоединен, иначе ‑ .FALSE.;

· recl - переменная, элемент массива или структуры целого типа. Возвращает длину (в байтах) записи файла прямого доступа. Если файл присоединен к неформатному УВВ, то это значение зависит от процессора (для DVF тоже в байтах);

· seq - переменная, элемент массива или структуры символьного типа. Возвращает 'YES' если УВВ или файл имеют последовательный доступ, иначе ‑ 'NO' или 'UNKNOWN';

· share - переменная, элемент массива или структуры символьного типа. Возвращает статус совместного использования, установленный в операторе OPEN: 'COMPAT', 'DENYRW', 'DENYWR', 'DENYRD' или 'DENYNONE';

· unformatted - переменная, элемент массива или структуры символьного типа. Возвращает 'YES' если установлен неформатный доступ к УВВ или файлу, иначе ‑ 'NO' или 'UNKNOWN'.

 

Оператор INQUIRE позволяет выяснить свойства УВВ или файла. Заметим, что невозможно узнать свойства неоткрытого файла или отличить заданные свойства от установленных по умолчанию.

Если любой параметр оператора INQUIRE является выражением с вызовом функций, они не должны содержать операторов ВВ и встроенной функции EOF.

 

Пример

 

* Программа запрашивает имя файла, а оператор INQUIRE определяет существует этот файл или нет. Если не существует, имя запрашивается снова.

CHARACTER*12 fname

LOGICAL exists

100 WRITE (*, '(1X, A\)') 'Введите имя файла: '

READ (*, '(A)') fname

INQUIRE (FILE = fname, EXIST = exists)

IF (.NOT. exists) THEN

WRITE (*, '(2A/)') ' > > Не найден файл ', fname

GOTO 100

END IF

END

Оператор LOCKING

 

LOCKING ( [UNIT=] unitspec

[, ERR=errlabel] [, IOSTAT=iocheck]

[, LOCKMODE=lockmode] [, REC=rec] [, RECORDS=recnum])

где

· параметры, набранные заглавными буквами являются ключевыми словами;

· unitspec - целое выражение, которое задает номер канала. Соответствующий файл должен иметь прямой доступ. Если ключевое слово UNIT= опущено, unitspec должен быть первым параметром, иначе параметры могут идти в любом порядке;

· errlabel - метка исполняемого оператора, расположенного в той же программной единице, на который передается управление в случае возникновения ошибки;

· iocheck - переменная, элемент массива или структуры целого типа, которые будут содержать код завершения выполнения оператора ENDFILE (0 при нормальном завершении или код ошибки, в случае ее возникновения).

· lockmode - символьное выражение со значением:

¨ 'NBLCK' ‑ закрывает область для чтения и записи. Если любая из записей уже закрыта, возникает ошибка выполнения программы. Действует по умолчанию.

¨ 'LOCK' ‑ закрывает область для чтения и записи. Ожидает, пока вся область станет доступной.

¨ 'NBRLCK' ‑ закрывает область для чтения. По чтению аналогичен 'NBLCK'.

¨ 'RLCK' ‑ закрывает область для чтения. По чтению аналогичен 'LOCK'.

'UNLCK' ‑ открывает область.

· rec - целое выражение, которое является номером первой записи в группе открываемых или закрываемых записей. Если опущено, то подразумевается следующая запись.

· recnum - целое выражение, которое устанавливает количество блокируемых записей. По умолчанию равно 1.

 

Оператор LOCKING блокирует файл или записи файла прямого доступа для использования другими пользователями сети. Оператор LOCKING не действует в версиях MS-DOS до v.3.0.

Если любой параметр оператора LOCKING является выражением с вызовом функций, они не должны содержать операторов ВВ и встроенной функции EOF.

Оператор OPEN

 

OPEN ([UNIT=]unitspec [, ACCESS=access] [, BLANK=blanks]

[, BLOCKSIZE=blocksize] [, ERR=errlabel] [, FILE=file]

[, FORM=form] [, IOSTAT=iocheck] [, MODE=mode]

[, RECL=recl] [, SHARE=share] [, STATUS=status])

где

· параметры, набранные заглавными буквами являются ключевыми словами;

· unitspec - звездочка (в этом случае нельзя использовать параметр NUMBER=) или целое выражение, которое задает номер канала. Если ключевое слово UNIT= опущено, unitspec должен быть первым параметром, иначе параметры могут идти в любом порядке. Одновременно может быть указан или параметр UNIT (при запросе свойств канала) или FILE (при запросе свойств файла);

· access - символьное выражение со значением 'APPEND', 'DIRECT' или 'SEQUENTIAL' (по умолчанию).

· blanks - символьное выражение со значением 'NULL' или 'ZERO'.

¨ 'NULL' (по умолчанию) ‑ игнорирование пробелов (тоже, что дескриптор BN; действует пока не указан явно дескриптор BZ в операторе READ).

¨ 'ZERO' ‑ обрабатывает пробелы как нули (тоже, что дескриптор BZ; действует пока не указан явно дескриптор BN в операторе READ).

· blocksize - целое выражение, определяющее размер буфера (в байтах) для УВВ.

· errlabel - метка исполняемого оператора, расположенного в той же программной единице, на который передается управление в случае возникновения ошибки;

· file - символьное выражение. Если параметр FILE= опущен, компилятор образует временный файл. Если задан пробелом (FILE=' '), выполняются следующие действия:

¨ Программа считывает имена файлов из списка аргументов (если имеется) командной строки. Если соответствующий аргумент является пустой строкой (''), выводится запрос на имя файла. Имена файлов в командной строке считываются в порядке следования операторов OPEN, у которых опущен параметр FILE.

¨ Если имеется больше операторов OPEN с параметром FILE=' ', выводится соответствующее количество запросов на имена файлов.

Если имя файла задано как 'USER' или 'CON', производится ввод и вывод с консоли.

· form - символьное выражение со значением 'FORMATTED', 'UNFORMATTED' или 'BINARY'. По умолчанию приняты значения 'FORMATTED' для последовательного доступа и 'UNFORMATTED' ‑ для прямого.

· iocheck - переменная, элемент массива или структуры целого типа, которые будут содержать код завершения выполнения оператора ENDFILE (0 при нормальном завершении, отрицательное значение при обнаружении записи конец файла или код ошибки, в случае ее возникновения);

· mode - символьное выражение со значением 'READ' (файл только для чтения), 'WRITE' (файл только для записи) или 'READWRITE'.

· recl - целое выражение, которое определяет длину записи для файлов прямого доступа.

· share - символьное выражение, которое определяет статус совместного использования файла. Разрешены значения:

¨ 'DENYRW' - запрет на чтение/запись для других;

¨ 'DENYWR' - запрет на запись для других;

¨ 'DENYRD' - запрет на чтение для других;

¨ 'DENYNONE' - разрешение на чтение/запись для других;

· status - символьное выражение со значениями 'OLD', 'NEW', 'UNKNOWN' (по умолчанию) или 'SCRATCH'.

 

Оператор OPEN связывает (открывает) канал с УВВ. Открытие файла по каналу * не оказывает никакого влияния, т.к. канал * постоянно связан с клавиатурой и экраном. Однако, можно использовать OPEN для открытия других предварительно открытых каналов (0, 5 и 6).

Подключение уже открытого канала к другому файлу вызывает автоматическое отключение (закрытие) первого файла. Но открытие нескольких каналов с одним файлом вызовет ошибку.

Первая операция READ или WRITE для не открытого явно канала приводит к ситуации подключения файла с пустым именем (см. выше параметр file ).

Если любой параметр оператора OPEN является выражением с вызовом функций, они не должны содержать операторов ВВ и встроенной функции EOF.

Пример открытие канала с новым файлом

 

CHARACTER*64 filename

 

WRITE (*, '(A\)') ' Введите имя файла '

READ (*, '(A)') filename

 

C Открывает канал 7 для нового форматного

C (по умолчанию)файла последовательного доступа

 

OPEN (7, FILE = filename, ACCESS = 'SEQUENTIAL',

* STATUS = 'NEW')

 

Пример открытия канала 3 для существующего файла с именем DATA3.TXT:

 

OPEN (3, FILE = 'DATA3.TXT')

 

Оператор PRINT

 

PRINT { * | formatspec | namelist } [, iolist]

где

· параметры, набранные заглавными буквами являются ключевыми словами;

· formatspec - спецификатор формата;

· namelist - имя списка NAMELIST;

· iolist - СВВ (список выводимых объектов).

 

Оператор PRINT предназначен в основном для вывода данных на экран. Если formatspec есть *, такой вывод называется управляемый списком. Если приведено имя списка NAMELIST, СВВ должен отсутствовать.

Оператор PRINT выводит данные только по каналу *.

СВВ не может включать структурных переменных, а только элементы структур.

Если любой параметр оператора PRINT является выражением с вызовом функций, они не должны содержать операторов ВВ и встроенной функции EOF.

 

Пример

 

Следующие два оператора эквивалентны

 

PRINT '(A11)', 'Abbottsford'

WRITE (*, '(A11)') 'Abbottsford'

 

 

Оператор READ

 

READ { { formatspec, | nmlspec } |

( [UNIT=] unitspec [, [ {[FMT=] formatspec] | [NML=]nmlspec}]

[, END=endlabel] [, ERR=errlabel] [, IOSTAT=iocheck]

[, REC=rec])} [ iolist ]

где

· параметры, набранные заглавными буквами являются ключевыми словами;

· Если опущен параметр UNIT=, unitspec должен быть первым параметром. Если опущены FMT= или NML=, fmtspec или nmlspec должны быть вторыми параметрами. При использовании ключевых слов параметры могут располагаться в любом порядке;

· unitspec - целое выражение, которое обозначает номер канала или символьная переменная в случае внутреннего файла;

· formatspec - спецификатор формата. Может быть меткой оператора FORMAT или собственно спецификатором формата. Параметр formatspec присутствует только при форматном вводе и не должен появляться при работе с неформатными файлами. Если опущены параметры UNIT=, END=, ERR= и REC=, а указаны только formatspec и iolist, такой оператор читает данные по каналу * (клавиатура);

· nmlspec - имя списка NAMELIST. Если присутствует этот параметр, СВВ должен отсутствовать. Ввод данных управляемый именованным списком может быть выполнен только из последовательных файлов;

· endlabel - метка исполняемого оператора в той же программной единице, на который передается управление если считана запись конец файла;

· errlabel - метка исполняемого оператора в той же программной единице, на который передается управление если возникает ошибка ввода;

· iocheck - переменная, элемент массива или структуры целого типа, которые будут содержать код завершения выполнения оператора READ;

· rec - целое положительное выражение, которое задает номер считываемой записи для файлов прямого доступа;

· iolist - СВВ (список вводимых объектов). В случае форматного ввода, СВВ не должен содержать структурных переменных, а только элементы структур.

 

Оператор READ предназначен для передачи данных из УВВ в элементы СВВ.

В случае считывания из внутреннего файла, unitspec является символьной подстрокой или переменной, элементом массива, массивом символьного типа, или несимвольным массивом, или элементом структуры.

Если на момент выполнения оператора READ канал предварительно не был открыт явно, выполняется его открытие с параметрами (см. п.3.5.7):

 

OPEN (unitspec, FILE = ' ', STATUS = 'OLD',

+ ACCESS = 'SEQUENTIAL', FORM = form)

 

где form имеет значение 'FORMATTED' для форматных и 'UNFORMATTED' для неформатных операций считывания.

Если любой параметр оператора READ является выражением с вызовом функций, они не должны содержать операторов ВВ и встроенной функции EOF.

Оператор READ может искажать работу некоторых графических текстовых функций таких как SETTEXTWINDOW, которые меняют расположение курсора. В этих случаях следует вводить текст с клавиатуры через функцию GETCHARQQ, а выводить через функцию OUTTEXT.

 

Пример

 

DIMENSION ia(10, 20)

 

READ(3, 990) il, jl, ((ia(i, j), j = 1, jl), i = 1, il)

990 FORMAT(2I5/(8I5))

 

Оператор REWIND

 

REWIND { unitspec | ( [UNIT=]unitspec

[, ERR=errlabel ] [, IOSTAT=iocheck ] ) }

где

· параметры, набранные заглавными буквами являются ключевыми словами;

· Если опущен параметр UNIT=, unitspec должен быть первым параметром.;

· unitspec - целое выражение, которое обозначает номер канала или символьная переменная в случае считывания из внутреннего файла;

· errlabel - метка исполняемого оператора в той же программной единице, на который передается управление если возникает ошибка ввода;

· iocheck - переменная, элемент массива или структуры целого типа, которые будут содержать код завершения выполнения оператора READ;

 

Оператор REWIND устанавливает файл в начало.

Если любой параметр оператора REWIND является выражением с вызовом функций, они не должны содержать операторов ВВ и встроенной функции EOF.

 

Пример

 

INTEGER int(80)

...

WRITE(7, '(80I1)') int! запись данных

...

REWIND 7! перемотка файла

...

READ(7, '(80I1)') int! считывание данных

 

Оператор WRITE

 

WRITE ( [UNIT=] unitspec [, [ { [ FMT=] formatspec] |

[ NML=] nmlspec } ] [, ERR=errlabel ]

[, IOSTAT=iocheck ] [, REC=rec ] ) [ iolist ]

где

· параметры, набранные заглавными буквами являются ключевыми словами;

· Если опущен параметр UNIT=, unitspec должен быть первым параметром. Если опущены FMT= или NML=, fmtspec или nmlspec должны быть вторыми параметрами. При использовании ключевых слов параметры могут располагаться в любом порядке;

· unitspec - целое выражение, которое обозначает номер канала; символьная переменная (подстрока, переменная, массив или элемент массива, элемент структуры) или несимвольный массив в случае считывания из внутреннего файла;


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-04-09; Просмотров: 1324; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.271 с.)
Главная | Случайная страница | Обратная связь