Справочник Ada 2012
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 используется для обозначения специальных условий).
тип Count есть диапазон 0 .. определяемая реализацией;
подтип Positive_Count есть Count диапазон 1 .. Count'Last;
подтип Positive_Count есть Count диапазон 1 .. Count'Last;
Для выходного файла или файла добавления может быть задана максимальная длина строки и максимальная длина страницы. Если значение, которое необходимо вывести, не помещается в текущей строке для заданной максимальной длины строки, то перед выводом значения автоматически начинается новая строка; если, кроме того, эта новая строка не помещается на текущей странице для заданной максимальной длины страницы, то перед выводом значения автоматически начинается новая страница. Предоставляются функции для определения максимальной длины строки и максимальной длины страницы. Когда файл открывается в режиме Out_File или Append_File, оба значения равны нулю: по соглашению, это означает, что длина строк и длина страниц не ограничены. (Следовательно, вывод состоит из одной строки, если подпрограммы для явного управления структурой строк и страниц не используются.) Для этой цели предоставляется константа Unbounded.