A.12.1 The Package Streams.Stream_IO
The subprograms in the child 
package Streams.Stream_IO provide control over stream files. Access to 
a stream file is either sequential, via a call on Read or Write to transfer 
an array of stream elements, or positional (if supported by the implementation 
for the given file), by specifying a relative index for an element. Since 
a stream file can be converted to a Stream_Access value, calling stream-oriented 
attribute subprograms of different element types with the same Stream_Access 
value provides heterogeneous input-output. See 
13.13 
for a general discussion of streams. 
 
Static Semantics
  The elements of a stream file are stream elements. 
If positioning is supported for the specified external file, a current 
index and current size are maintained for the file as described in 
A.8. 
If positioning is not supported, a current index is not maintained, and 
the current size is implementation defined.
 
 
The library package 
Streams.Stream_IO has the following declaration: 
with Ada.IO_Exceptions;
package Ada.Streams.Stream_IO 
is
    pragma Preelaborate(Stream_IO);
 
    type Stream_Access 
is access all Root_Stream_Type'Class;
 
    type File_Type 
is limited private;
    
pragma Preelaborable_Initialization(File_Type);
 
    type File_Mode 
is (In_File, Out_File, Append_File);
 
    type    Count          
is range 0 .. 
implementation-defined;
    
subtype Positive_Count 
is Count 
range 1 .. Count'Last;
      -- 
Index into file, in stream elements. 
    procedure Create (File : 
in out File_Type;
                      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 := "");
 
    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);
 
    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 Is_Open     (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;
        -- 
Return stream access for use with T'Input and T'Output 
This paragraph 
was deleted.
    -- 
Read array of stream elements from file
    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);
 
This paragraph 
was deleted.
    -- 
Write array of stream elements into file
    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);
 
This paragraph 
was deleted.
    -- Operations on position within file
    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;
 
    procedure Set_Mode(File : 
in out File_Type; Mode : 
in File_Mode);
 
    procedure Flush(File : 
in File_Type);
 
    -- 
exceptions
    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
   ... -- not specified by the language
end Ada.Streams.Stream_IO;
   The type File_Type needs finalization
 
(see 
7.6).
 
 The subprograms given in subclause 
A.8.2 
for the control of external files (Create, Open, Close, Delete, Reset, 
Mode, Name, Form, Is_Open, and Flush) are available for stream files.
 
   The End_Of_File 
function: 
Propagates Mode_Error if the mode of the file is 
not In_File;
If positioning is supported for the given external 
file, the function returns True if the current index exceeds the size 
of the external file; otherwise, it returns False;
If positioning is not supported for the given external 
file, the function returns True if no more elements can be read from 
the given file; otherwise, it returns False. 
   The Set_Mode procedure sets the mode of the file. 
If the new mode is Append_File, the file is positioned to its end; otherwise, 
the position in the file is unchanged.
   This paragraph 
was deleted.
 The Stream function returns a Stream_Access result 
from a File_Type object, thus allowing the stream-oriented attributes 
Read, Write, Input, and Output to be used on the same file for multiple 
types. Stream propagates Status_Error if File is not open.
 The procedures Read and Write are equivalent to 
the corresponding operations in the package Streams. Read propagates 
Mode_Error if the mode of File is not In_File. Write propagates Mode_Error 
if the mode of File is not Out_File or Append_File. The Read procedure 
with a Positive_Count parameter starts reading at the specified index. 
The Write procedure with a Positive_Count parameter starts writing at 
the specified index. For a file that supports positioning, Read without 
a Positive_Count parameter starts reading at the current index, and Write 
without a Positive_Count parameter starts writing at the current index.
   The Size function returns the current size of 
the file.
 The Index function returns the current index. 
The Set_Index procedure sets the current index to 
the specified value.
   If positioning is 
supported for the external file, the current index is maintained as follows:
For Open and Create, if the Mode parameter is Append_File, 
the current index is set to the current size of the file plus one; otherwise, 
the current index is set to one.
For Reset, if the Mode parameter is Append_File, 
or no Mode parameter is given and the current mode is Append_File, the 
current index is set to the current size of the file plus one; otherwise, 
the current index is set to one.
For Set_Mode, if the new mode is Append_File, the 
current index is set to current size plus one; otherwise, the current 
index is unchanged.
For Read and Write without a Positive_Count parameter, 
the current index is incremented by the number of stream elements read 
or written.
For Read and Write with a Positive_Count parameter, 
the value of the current index is set to the value of the Positive_Count 
parameter plus the number of stream elements read or written. 
If positioning is not supported for the given file, 
then a call of Index or Set_Index propagates Use_Error. Similarly, a 
call of Read or Write with a Positive_Count parameter propagates Use_Error.
Paragraphs 34 through 
36 were deleted. 
Erroneous Execution
   If the File_Type object passed 
to the Stream function is later closed or finalized, and the stream-oriented 
attributes are subsequently called (explicitly or implicitly) on the 
Stream_Access value returned by Stream, execution is erroneous. This 
rule applies even if the File_Type object was opened again after it had 
been closed. 
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe