Справочник Ada 2005
A.10 Ввод-вывод текста
Статическая семантика
Данный раздел описывает пакет Text_IO, предоставляющий средства для ввода-вывода в удобочитаемой форме. Каждый файл читается или записывается последовательно, как последовательность символов, сгруппированных в строки, и как последовательность строк, сгруппированных в страницы. Спецификация пакета приведена ниже в подпункте A.10.1.
Вышеприведенные средства управления файлами, описанные в подпунктах A.8.2 и A.8.3, доступны для ввода-вывода текста. Однако вместо процедур Read и Write существуют процедуры Get и Put, которые вводят значения подходящих типов из текстовых файлов и выводят значения в них. Эти значения предоставляются процедурам Put и возвращаются процедурами Get в параметре Item. Существует несколько перегруженных процедур с такими именами для разных типов Item. Эти процедуры Get анализируют входные последовательности символов на основе лексических элементов (см. раздел 2) и возвращают соответствующие значения; процедуры Put выводят заданные значения в виде соответствующих лексических элементов. Также доступны процедуры Get и Put, которые вводят и выводят отдельные символы, рассматриваемые как значения символов, а не как лексические элементы. Связанные с вводом символов процедуры позволяют предварительно просмотреть следующий символ без его чтения и прочитать символ «немедленно» без ожидания конца строки для сигнализации о доступности.
В дополнение к процедурам Get и Put для числовых и перечислительных типов Item, которые работают с текстовыми файлами, предоставляются аналогичные процедуры, которые читают из и записывают в параметр типа String. Эти процедуры выполняют тот же анализ и композицию последовательностей символов, что и их аналоги, имеющие параметр файла.
Для всех процедур Get и Put, которые работают с текстовыми файлами, и для многих других подпрограмм существуют варианты с параметром файла и без него. Каждая такая процедура Get работает с входным файлом, а каждая такая процедура Put — с выходным файлом. Если файл не указан, используется файл по умолчанию для ввода или для вывода.
В начале выполнения программы файлы по умолчанию для ввода и вывода называются стандартным файлом ввода и стандартным файлом вывода. Эти файлы открыты, имеют соответственно текущие режимы In_File и Out_File и связаны с двумя внешними файлами, определяемыми реализацией. Предоставляются процедуры для изменения текущего файла по умолчанию для ввода и текущего файла по умолчанию для вывода.
В начале выполнения программы, файл по умолчанию для вывода связанных с программой сообщений об ошибках, называется стандартным файлом ошибок. Этот файл открыт, имеет текущий режим Out_File и связан с определенным реализацией внешним файлом. Предоставляется процедура для изменения текущего файла ошибок по умолчанию.
С логической точки зрения, текстовый файл представляет собой последовательность страниц, страница — последовательность строк, а строка — последовательность символов; конец строки отмечается разделителем строки; конец страницы отмечается сочетанием разделителя строки, немедленно за которым следует разделитель страницы; и конец файла отмечается сочетанием разделителя строки, немедленно за которым следует разделитель страницы, а затем разделитель файла. Разделители генерируются во время вывода; либо путем вызова процедур, специально предназначенных для этой цели; либо неявно как часть других операций, например, когда для файла была задана ограниченная длина строки, ограниченная длина страницы или оба значения.
Фактическая природа разделителей не определена языком и, следовательно, зависит от реализации. Хотя разделители распознаются или генерируются определенными процедурами, которые следуют за ними, они не обязательно реализуются как символы или как последовательности символов. То, являются ли они символами (и если да, то какими) в любой конкретной реализации, не должно беспокоить пользователя, который не явно не выводит и не явно не вводит управляющие символы. Эффект ввода (Get) или вывода (Put) управляющих символов (кроме горизонтальной табуляции) не определен языком.
Символы строки нумеруются, начиная с единицы; число символа называется его номером столбца. Для разделителя строки также определен номер столбца: он на единицу больше, чем количество символов в строке. Строки страницы и страницы файла также нумеруются. Текущий номер столбца — это номер столбца следующего символа или разделителя строки, который будет передан. Текущий номер строки — это номер текущей строки. Текущий номер страницы — это номер текущей страницы. Эти числа являются значениями подтипа Positive_Count типа Count (по соглашению, значение нуль типа Count используется для обозначения специальных условий).
type Count is range 0 .. определяемая реализацией;
subtype Positive_Count is Count range 1 .. Count'Last;
subtype Positive_Count is Count range 1 .. Count'Last;
Для выходного файла или файла добавления может быть указана максимальная длина строки и максимальная длина страницы. Если значение, которое необходимо вывести, не помещается в текущей строке, для заданной максимальной длины строки, то перед выводом значения автоматически начинается новая строка; если, кроме того, эта новая строка не помещается на текущей странице, для заданной максимальной длины страницы, то перед выводом значения автоматически начинается новая страница. Предоставляются функции для определения максимальной длины строки и максимальной длины страницы. Когда файл открывается в режиме Out_File или Append_File, оба значения равны нулю: по соглашению, это означает, что длины строк и страниц не ограничены. (Следовательно, вывод состоит из одной строки, если подпрограммы для явного управления структурой строк и страниц не используются.) Для этой цели предоставлена константа Unbounded.