next up previous contents
След.: Упражнение Выше: Ввод и вывод Пред.: Именованные списки ввода/вывода   Содержание


Запросы

Оператор INQUIRE служит для запросов о файле, устройстве или списке вывода. Запросы о файле задействуют спецификатор FILE, об устройстве -- спецификатор UNIT, а о списке вывода -- спецификатор IOLENGTH и только его одного. Устройство не обязано быть соединено с файлом и даже существовать. Если оно существует и соединено с файлом, поставляется информация о соединении и присоединенном файле. Любая поставляемая информация актуальна в момент выполнения оператора. Синтаксис оператора:

INQUIRE (список спецификаторов) или

INQUIRE (IOLENGTH = целая переменная) список вывода

Примеры запросов [14]:

INQUIRE (IOLENGTH = IOL) A (1:N)

INQUIRE (UNIT = JOAN, OPENED = LOG_01, NAMED = LOG_02,&

& FORM = CHAR_VAR, IOSTAT = IOS)

При запросе длины списка (вторая форма) в указанную переменную записывается системно-зависимое число единиц хранения, которые необходимы для хранения данных, указанных в списке вывода, в неформатном файле. Значение может быть использовано как значение спецификатора RECL оператора OPEN.

Среди возможных спецификаторов (обязательны только UNIT и FILE, причем один из них) многие парны одноименным спецификаторам оператора OPEN (они возвращают информацию, которую те задают). Они имеют вид спецификатор=переменная, где переменная имеет тот же тип, что и возможные значения соответствующего спецификатора оператора OPEN (чаще всего -- строка). В списке ниже они указаны как парные для OPEN.

Спецификаторы UNIT и FILE задают устройство (целое число) и имя файла соответственно. Символы UNIT= могут быть опущены, но тогда значение должно идти первым. Список спецификаторов:

ACCESS, ACTION, ASYNCHRONOUS, FORM
-- задают строковую переменную; возвращаемые значения -- см. оператор OPEN. Если файл не присоединен, результатом будет значение 'UNDEFINED'.

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

DIRECT, SEQUENTIAL, STREAM
-- задают строковую переменную, в которую записываются значения 'YES' или 'NO' в зависимости от того, возможен ли соответствующий доступ (см. значения спецификаторов ACCESS, FORM и ACTION) для данного файла; если определить это не удалось или устройство не присоединено к файлу, возвращается значение 'UNKNOWN'.

FORMATTED, UNFORMATTED, READ, WRITE, READWRITE
-- см. предыдущие спецификаторы.

ENCODING
-- задает переменную строкового типа, в которую записывается значение 'UTF-8', если файл подсоединен как форматный и кодировка задана как 'UTF-8'. Если файл неформатный, значением будет 'UNDEFINED'. Если файл не присоединен, то значение 'UTF-8' присваивается, если удалось определить кодировку файла и она соответствующая. Если не удалось или устройство не соединено с файлом, значением будет 'UNKNOWN'. Стандарт допускает другие значения, если поддерживаются другие кодировки.

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

EXIST, OPENED
-- задают переменную логического типа, определяющую, существует ли файл с данным именем или устройство с данным номером, и связан ли данный файл с каким-либо устройством или данное устройство с каким-либо файлом.

ID
-- задает значение идентификатора отложенной операции асинхронной записи или чтения (о которой делается запрос). Этот спецификатор взаимодействует с PENDING.

NAME
-- задает строковую переменную, в которую заносится имя файла, если оно есть (в противном случае она не определена; проверить, обладает ли файл именем, позволяет спецификатор NAMED, задающий логическую переменную). Имя не обязано совпадать со значением спецификатора FILE оператора OPEN (поскольку может быть добавлен путь, идентификатор пользователя и т.п. в зависимости от системы), но стандарт требует пригодности возвращаемого значения для спецификатора FILE оператора OPEN.

NEXTREC
-- задает целочисленную переменную, которой присваивается значение $ n+1$ , где $ n$ -- номер последней записанной или прочитанной записи при прямом доступе. Если чтения и записи не было, значение равно 1. Если соединение отсутствует или не для прямого доступа, или была ошибка, препятствующая определению номера последней записи, значение не определено. Если отложенная операция (асинхронного) чтения/записи еще не завершена, значение возвращается как если бы операция уже завершилась.

NUMBER
-- задает целочисленную переменную, которой присваивается номер устройства, связанного с файлом. Указание этого спецификатора применительно к устройству (то есть со спецификатором UNIT) тавтологично (но не запрещено). Значение $ -1$ соответствует файлу, не связанному с устройством.

PENDING
-- задает переменную логического типа, определяющую, завершилась ли отложенная операция (асинхронного) чтения или записи (на момент начала выполнения оператора запроса). Ложное значение означает, что операция завершилась. Если указан спецификатор ID, то возвращается ложное значение и оператор запроса инициирует ситуацию ожидания окончания соответствующей операции чтения или записи. Если спецификатор ID опущен и все асинхронные операции чтения и записи для данного устройства завершились, возвращается ложное значение и инициируется ситуация ожидания для всех этих операций (то есть завершившиеся операции более не считаются отложенными и соответствующие данные реально записаны или прочитаны -- реального ожидания нет, поскольку операции уже завершены). В остальных случаях значение истинно, ситуация ожидания не инициируется, все отложенные операции остаются таковыми. Стандарт оставляет системе значительную свободу в определении статуса завершенности операций чтения и записи. Возможны варианты: операция не считается завершенной вплоть до соответствующей ситуации ожидания ее завершения (в этом случае значение всегда истинно, если есть хоть одна отложенная операция на устройстве); оператор запроса инициирует ситуации ожидания завершения всех операций и возвращает ложное значение; оператор запроса реально выясняет статус операций. Спецификатор PENDING обязан присутствовать, если присутствует спецификатор ID).

POS
-- задает целочисленную переменную, которой присваивается номер единицы хранения, следующей за текущей позицией в файле потокового доступа. Если позиция в файле последняя, значение на единицу превосходит номер максимальной единицы хранения в файле. Значение не определено, если соединение отсутствует, файл не потоковый или были ошибки, препятствующие определению позиции.

POSITION
-- задает строковую переменную, которой присваиваются значения одноименного спецификатора оператора OPEN. Если файл не соединен или открыт для прямого доступа, присваивается значение 'UNDEFINED'. Если имели место операции позиционирования, значение зависит от системы, но не совпадает с уже определенными значениями (если только эти значения не соответствуют действительности).

RECL
-- задает целочисленную переменную, которой присваивается длина записи файла прямого доступа или максимальная длина записи для файла последовательного доступа. Для форматных файлов длина измеряется в символах, для неформатных -- в единицах хранения. Если соединение с файлом отсутствует или файл потоковый, значений не определено.

SIZE
-- задает целочисленную переменную, которой присваивается размер файла в единицах хранения или значение $ -1$ , если соединение данного устройства с каким-либо файлом отсутствует или определить размер файла невозможно. Если файл может быть присоединен для потокового доступа, его размер есть максимальный номер единицы хранения. Для файлов последовательного и прямого доступа размер файла не обязательно соответствует объему данных в записях; зависимость между ними зависит от системы.

В начале работы достаточен форматный вывод с опциями по умолчанию. Если следует выводить большие массивы данных, стоит освоить простейший прямой ввод/вывод. У оператора OPEN следует знать спецификаторы UNIT, NAME, FORM, STATUS, RECL (для прямого доступа). Оператор PRINT выводит текст на консоль и удобен для вывода диагностической, контрольной и отладочной информации. Формат по умолчанию чаще всего приемлем, как и в операторах READ и WRITE при работе с форматными файлами. Для последних следует знать спецификаторы UNIT, FMT и REC (при прямом доступе). Оператор запроса, при всей его мощи, используется в сложных программах и для повышения переносимости и надежности программ, так что при первом знакомстве не обязателен. При работе с прямым доступом полезен его спецификатор IOLENGTH, позволяющий определить размер записи. Следует помнить о внутренних файлах (по сути, строка качестве устройства), так как они используются как средство конвертации данных в и из текстовой формы. Удобны именованные списки, так как они позволяют отслеживать ввод, например, параметров, а также облегчает отладку.


next up previous contents
След.: Упражнение Выше: Ввод и вывод Пред.: Именованные списки ввода/вывода   Содержание
Ilya A. Chernov 2012-12-19
X