next up previous contents
След.: Внешние файлы Выше: Ввод и вывод Пред.: Ввод и вывод   Содержание


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

Операторы ввода обеспечивают перенос данных с внешних носителей внутрь программы или внутри программы; этот процесс называется чтением. Операторы вывода дают возможность переносить данные из программы на внешние носители или из программы во внутренний файл; это процесс записи. Основные понятия здесь -- это файл и устройство (точнее, логическое устройство). Под внешним файлом понимается то, что считает таковым операционная система: дисковый файл, канал, принтер, консоль и т.п. Внутренний файл -- это текстовая строка или массив строк; это специфика языка Фортран, основная цель -- конвертация числовых данных в текст и обратно. Устройство -- объект языка, однозначно связанный с файлом; он указывается в операторах ввода/вывода и в зависимости от него компилятор генерирует те или иные низкоуровневые команды доступа к устройствам. Устройства представляют собой целые числа без знака для внешних файлов, строки или массивы строк -- для внутренних, а также символ * как псевдоним для стандартных устройств ввода и вывода (обычно это консоль). Есть возможность получить и соответствующие числа, если это необходимо. Так, связав некий файл на диске с устройством 1, мы можем осуществлять запись в файл, чтение из него и другие операции с файлом, в том числе -- запрос информации о файле, указывая число 1 в качестве устройства в соответствующих операторах.

Все операторы имеют сходную структуру. После имени оператора в скобках указывается список спецификаторов в форме имя=значение. Имена определены Стандартом. Значениями могут быть текстовые строки (выбор фиксирован -- это описатели различных режимов работы), целые числа, имена переменных целого или строкового типа (туда будет записана та или иная информация) или целые числа-метки строк, на которые осуществляется переход в случае возникновения тех или иных ситуаций или в которых записана информация о формате. Для обязательных спецификаторов имя может быть опущено, но тогда значение должно идти первым (вторым, если первым идет другой обязательный спецификатор). Некоторые спецификаторы допускают несколько разных видов значений: например, спецификатор FMT, указывающий формат, может иметь значением строку текста, описывающую форматирование, символ * (формат по умолчанию) или целое число -- метку строки с описанием формата. Если у оператора один спецификатор и его имя опущено, можно опустить и скобки. Некоторые операторы языка, не относящиеся к вводу/выводу, используют концепцию спецификаторов, например, ALLOCATE.

Ввод и вывод бывают синхронными и асинхронными (поддержка асинхронного ввода/вывода появилась в Fortran-2003). Синхронные операции ввода и вывода блокируют выполнение программы (или образа) вплоть до своего завершения (поэтому синхронные операции еще называются блокирующими). Поскольку, как правило, устройства ввода/вывода работают существенно медленнее вычислительных устройств (процессор, оперативная память), синхронный ввод и вывод способен существенно замедлить работу программ. Асинхронный ввод и вывод не блокирует работу тех операторов, которые не зависят от результатов операций ввода и вывода (не используют прочитанные данные и не модифицируют записываемые данные, в частности), а для синхронизации процессов ввода/вывода с теми операторами, с которыми это необходимо, существуют специальные средства. Выполнение оператора асинхронной записи или чтения без ошибок и ситуаций «конец файла» и «конец записи» запускает отложенную операцию чтения или записи. Их может быть одновременно несколько для одного или нескольких устройств. Отложенная операция остается отложенной вплоть до создания ситуации ожидания завершения операции. Ситуацию ожидания завершения операции можно инициировать явно с помощью оператора WAIT и неявно с помощью операторов чтения и записи (PRINT, READ, WRITE), запроса (INQUIRE), закрытия файла (CLOSE), сброса (FLUSH) и позиционирования (BACKSPACE, ENDFILE и REWIND). Иными словами, оператор, инициирующий ситуацию ожидания, останавливает ход программы (или образа) и ждет завершения отложенной операции (асинхронного) чтения или записи, начатой когда-то ранее.

Объекты данных, подлежащие асинхронному вводу или выводу, снабжаются атрибутом ASYNCHRONOUS. При этом запрещены некоторые оптимизации, перемещающие код, поскольку возможна ситуация, при которой данные еще выводятся или вводятся в ходе дальнейшей работы программы. Атрибут назначается автоматически, если объект используется в операторах асинхронного ввода/вывода, но может быть и указан в явной форме.

Помимо операторов чтения/записи существуют вспомогательные операторы: для управления внешним устройством и для описания или исследования его свойств.

Список операторов ввода/вывода: BACKSPACE, CLOSE, ENDFILE, FLUSH, INQUIRE, OPEN, PRINT, READ, REWIND, WAIT, WRITE.

Файл -- внешний либо внутренний -- состоит из последовательности или единиц хранения (потоковый файл), или записей (файл записей). Запись -- это последовательность значений либо символов. Например, строка в терминале -- это запись. Однако запись не обязана относится к физической сущности. Существует три типа записей: форматированные, неформатные и конец файла.

Форматированная запись состоит из последовательности символов; длина записи измеряется в символах. Обычно она определяется числом записанных символов, но может зависеть от системы и носителя. Длина может быть нулевой. Форматированные записи могут читаться или записываться только операторами форматированного ввода/вывода.

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

Запись «конец файла» записывается оператором ENDFILE или неявно при закрытии или перемотке файла, если последней была операция записи. файл должен быть последовательным. Она может быть только последней и длины не имеет. Может не иметь физического воплощения (например, если конец файла определяется подсчетом записей).



Ilya A. Chernov 2012-12-19
X