Справочное руководство по Ada 95
A.12.1 Пакет Streams.Stream_IO
Подпрограммы дочернего пакета Streams.Stream_IO обеспечивают управление файлами потоков. Доступ к файлу потока осуществляется либо последовательно, через вызов Read или Write для передачи массива элементов потока, либо позиционно (если это поддерживается реализацией для данного файла), путем указания относительного индекса элемента. Поскольку файл потока может быть преобразован в значение Stream_Access, вызов подпрограмм атрибутов, ориентированных на потоки, разных типов элементов с одним и тем же значением Stream_Access обеспечивает разнородный ввод-вывод. См. 13.13 для общего обсуждения потоков.
Статическая семантика
Элементы файла потока — это элементы потока. Если позиционирование поддерживается для указанного внешнего файла, для файла поддерживаются текущий индекс и текущий размер, как описано в A.8. Если позиционирование не поддерживается, текущий индекс не поддерживается, а текущий размер определяется реализацией.
Пакет библиотеки Streams.Stream_IO имеет следующее объявление:
with Ada.IO_Exceptions;
package Ada.Streams.Stream_IO is
package Ada.Streams.Stream_IO is
type Stream_Access is access all Root_Stream_Type'Class;
type File_Type is limited private;
type File_Mode is (In_File, Out_File, Append_File);
type Count is range 0 .. определяемое реализацией;
subtype Positive_Count is Count range 1 .. Count'Last;
-- Индекс в файле, в элементах потока.
subtype Positive_Count is Count range 1 .. Count'Last;
-- Индекс в файле, в элементах потока.
procedure Create (File : in out File_Type;
Mode : in File_Mode := Out_File;
Name : in String := "";
Form : in String := "");
Mode : in File_Mode := Out_File;
Name : in String := "";
Form : in String := "");
procedure Open (File : in out File_Type;
Mode : in File_Mode;
Name : in String;
Form : in String := "");
Mode : in File_Mode;
Name : in String;
Form : in String := "");
procedure Close (File : in out File_Type);
procedure Delete (File : in out File_Type);
procedure Reset (File : in out File_Type; Mode : in File_Mode);
procedure Reset (File : in out File_Type);
procedure Delete (File : in out File_Type);
procedure Reset (File : in out File_Type; Mode : in File_Mode);
procedure Reset (File : in out File_Type);
function Mode (File : in File_Type) return File_Mode;
function Name (File : in File_Type) return String;
function Form (File : in File_Type) return String;
function Name (File : in File_Type) return String;
function Form (File : in File_Type) return String;
function Is_Open (File : in File_Type) return Boolean;
function End_Of_File (File : in File_Type) return Boolean;
function End_Of_File (File : in File_Type) return Boolean;
function Stream (File : in File_Type) return Stream_Access;
-- Возвращает доступ к потоку для использования с T'Input и T'Output
-- Возвращает доступ к потоку для использования с T'Input и T'Output
Этот абзац был удален.
-- Чтение массива элементов потока из файла
procedure Read (File : in File_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset;
From : in Positive_Count);
procedure Read (File : in File_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset;
From : in Positive_Count);
procedure Read (File : in File_Type;
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset);
Item : out Stream_Element_Array;
Last : out Stream_Element_Offset);
Этот абзац был удален.
-- Запись массива элементов потока в файл
procedure Write (File : in File_Type;
Item : in Stream_Element_Array;
To : in Positive_Count);
procedure Write (File : in File_Type;
Item : in Stream_Element_Array;
To : in Positive_Count);
procedure Write (File : in File_Type;
Item : in Stream_Element_Array);
Item : in Stream_Element_Array);
Этот абзац был удален.
-- Операции с позицией внутри файла
procedure Set_Index(File : in File_Type; To : in Positive_Count);
function Index(File : in File_Type) return Positive_Count;
function Size (File : in File_Type) return Count;
function Size (File : in File_Type) return Count;
procedure Set_Mode(File : in out File_Type; Mode : in File_Mode);
procedure Flush(File : in File_Type);
-- исключения
Status_Error : exception renames IO_Exceptions.Status_Error;
Mode_Error : exception renames IO_Exceptions.Mode_Error;
Name_Error : exception renames IO_Exceptions.Name_Error;
Use_Error : exception renames IO_Exceptions.Use_Error;
Device_Error : exception renames IO_Exceptions.Device_Error;
End_Error : exception renames IO_Exceptions.End_Error;
Data_Error : exception renames IO_Exceptions.Data_Error;
Status_Error : exception renames IO_Exceptions.Status_Error;
Mode_Error : exception renames IO_Exceptions.Mode_Error;
Name_Error : exception renames IO_Exceptions.Name_Error;
Use_Error : exception renames IO_Exceptions.Use_Error;
Device_Error : exception renames IO_Exceptions.Device_Error;
End_Error : exception renames IO_Exceptions.End_Error;
Data_Error : exception renames IO_Exceptions.Data_Error;
private
... -- не определено языком
end Ada.Streams.Stream_IO;
... -- не определено языком
end Ada.Streams.Stream_IO;
Подпрограммы Create, Open, Close, Delete, Reset, Mode, Name, Form, Is_Open и End_of_File имеют тот же эффект, что и соответствующие подпрограммы в Sequential_IO (см. A.8.2).
Процедура Set_Mode изменяет режим файла. Если новый режим — Append_File, позиция в файле устанавливается в конец; в противном случае позиция в файле остается неизменной.
Процедура Flush синхронизирует внешний файл с внутренним (путем сброса всех внутренних буферов) без закрытия файла или изменения позиции. Mode_Error передается, если режим файла In_File.
Функция Stream возвращает значение Stream_Access из объекта File_Type, что позволяет использовать атрибуты, ориентированные на поток, Read, Write, Input и Output для одного и того же файла с разными типами. Stream передает Status_Error, если File не открыт.
Процедуры Read и Write эквивалентны соответствующим операциям в пакете Streams. Read передает Mode_Error, если режим File не In_File. Write передает Mode_Error, если режим File не Out_File или Append_File. Процедура Read с параметром Positive_Count начинает чтение с указанного индекса. Процедура Write с параметром Positive_Count начинает запись с указанного индекса.
Функция Size возвращает текущий размер файла.
Функция Index возвращает текущий индекс.
Процедура Set_Index устанавливает текущий индекс в указанное значение.
Если позиционирование поддерживается для внешнего файла, текущий индекс поддерживается следующим образом:
- Для Open и Create, если параметр Mode — Append_File, текущий индекс устанавливается в текущий размер файла плюс один; в противном случае текущий индекс устанавливается в один.
- Для Reset, если параметр Mode — Append_File, или параметр Mode не задан, а текущий режим — Append_File, текущий индекс устанавливается в текущий размер файла плюс один; в противном случае текущий индекс устанавливается в один.
- Для Set_Mode, если новый режим — Append_File, текущий индекс устанавливается в текущий размер плюс один; в противном случае текущий индекс остается неизменным.
- Для Read и Write без параметра Positive_Count текущий индекс увеличивается на количество элементов потока, прочитанных или записанных.
- Для Read и Write с параметром Positive_Count значение текущего индекса устанавливается в значение параметра Positive_Count плюс количество прочитанных или записанных элементов потока.
Если позиционирование не поддерживается для данного файла, то вызов Index или Set_Index передает Use_Error. Аналогично, вызов Read или Write с параметром Positive_Count передает Use_Error.
Этот абзац был удален.
Этот абзац был удален.
Этот абзац был удален.
Ошибочное выполнение
Если объект File_Type, переданный функции Stream, впоследствии закрывается или завершается, и атрибуты, ориентированные на поток, впоследствии вызываются (явно или неявно) на значении Stream_Access, возвращенном Stream, выполнение является ошибочным. Это правило действует даже в том случае, если объект File_Type был открыт снова после закрытия.