Ada Programming/Libraries/Ada.Sequential IO

From Wikibooks, open books for an open world
Jump to: navigation, search


Background[edit]

Not all data read or written is in text format. For storage or inter-process communication, it is more space- and processing time-efficient to store data in binary format.

Binary input and output for sequential data (that is, read/written one after another) is managed by the generic Ada package Ada.Sequential_IO.

The generic package must be instantiated with some Element_Type, and provides a limited private File_Type.

The file mode, In_File or Out_File, is established on open or create.

The package provides the basic input/output (I/O) operations:

  • Open, Create
  • Close, Delete, and Reset
  • Read, Write

In addition, the package provides status and information functions:

  • Is_Open
  • End_Of_File
  • Name, Mode, and Form

One important restriction is that every element of a file must be the same element type.

Ada Code Example[edit]

For example, suppose that a student has collected information on trees in a 10 meter by 10 meter plot, and wishes a report generated from the data.
The following is a simple program to read the sequential data, previously recorded:

   with Ada.Text_IO; -- Text I/O library
   with Ada.Float_Text_IO; -- Float I/O library
   with Ada.Sequential_IO; -- Sequential I/O library
 
   procedure Tree_Report is
 
   -- First, define the contents of the data record
 
      type Tree_Record is 
         record
            Common_Name     : String(1..20) := (others => ' ');
            Scientific_Name : String(1..20) := (others => ' ');
            Diameter        : Float         := 0.0; -- at breast height (DBH)
         end record; -- Tree_Record
 
-- Now, instantiate the I/O package for the data record
 
      package Tree_IO is new Ada.Sequential_IO(Tree_Record);
 
      Tree_File : Tree_IO.File_Type; -- Input data file
 
      Tree_Data : Tree_Record; -- Individual data record
 
   begin -- Tree_Report
 
-- Open the input data file.
 
      Tree_IO.Open(File => Tree_File,
                   Mode => Tree_IO.In_File,
                   Name => "tree.dat");
 
   -- Write report heading
      Ada.Text_IO.Set_Col(To =>  1); Ada.Text_IO.Put("COMMON NAME");
      Ada.Text_IO.Set_Col(To => 21); Ada.Text_IO.Put("SCIENTIFIC NAME");
      Ada.Text_IO.Set_Col(To => 41); Ada.Text_IO.Put("DBH");
      Ada.Text_IO.New_Line;
 
   Process_Tree_Data:
      while not Tree_IO.End_Of_File(Tree_File) loop
 
         Tree_IO.Read(Tree_File, Tree_Data); -- Read tree data
 
      -- Write tree inventory
         Ada.Text_IO.Put(Tree_Data.Common_Name);
         Ada.Text_IO.Put(Tree_Data.Scientific_Name);
         Ada.Float_Text_IO.Put(Tree_Data.Diameter,Fore=>2,Aft=>2,Exp=>0);
         Ada.Text_IO.New_Line;
 
      end loop Process_Tree_Data;
 
-- All data records have been read, and end_of_file detected.
 
      Tree_IO.Close(Tree_File); -- Done, close file
 
   end Tree_Report;