Considering SEQUENTIAL_IO in more detail, its specification commences:
with IO_EXCEPTIONS; generic type ELEMENT_TYPE is private; package SEQUENTIAL_IO is type FILE_TYPE is limited private; type FILE_MODE is (IN_FILE, OUT_FILE); ... end SEQUENTIAL_IO;
(The package IO_EXCEPTIONS is explained in section 16.6 below.)
The one generic parameter gives the type of elements in the file. Note that this is private but not limited; this reflects the fact that input-output cannot be performed on limited types, since to do so would indirectly permit assignment; it also forbids attempts to output task values.
The declarations of FILE_TYPE and FILE_MODE then follow. Note that FILE_MODE has only two values - read-write access is not defined for sequential files.
The specification then contains the various file management procedures, CREATE, OPEN, CLOSE, DELETE, and RESET, which were discussed above.
Next come a group of functions which give access to the properties of a file; they are
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;
These functions will be found useful when writing general-purpose procedures that manipulate files passed as parameters. They enable the general state of a file to be checked before it is used, and thereby avoid raising exceptions.
Actual input and output is performed by procedures READ and WRITE, which have the specifications:
procedure READ (FILE : in FILE_TYPE; ITEM : out ELEMENT_TYPE); procedure WRITE (FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE);
Calls of READ and WRITE access the file element at the current position and then move on, ready to access the next element. In other words they increment the hidden index value.
function END_OF_FILE(FILE : in FILE_TYPE) return BOOLEAN;
which only applies to files of mode IN_FILE, returns TRUE if there are no more elements to be read.
The package specification concludes with the renaming declarations of various exceptions, as explained in section 16.6 below.
The package DIRECT_IO is very similar. The differences are that the mode now has three values
type FILE_MODE is (IN_FILE, INOUT_FILE, OUT_FILE);
and there are additional subprograms for direct manipulation of the index. These are
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;
type COUNT is range 0 .. implementation_defined; subtype POSITIVE_COUNT is COUNT range 1 .. COUNT'LAST;
are declared within DIRECT_IO and specify the type of the index values.
The function INDEX returns the current index value and SET_INDEX enables it to be set. The function SIZE gives the number of items in the file (defined or undefined).
Finally there are overloadings of READ and WRITE with a further parameter giving the index value:
procedure READ (FILE : in FILE_TYPE; ITEM : out ELEMENT_TYPE; FROM : in POSITIVE_COUNT); procedure WRITE (FILE : in FILE_TYPE; ITEM : in ELEMENT_TYPE; TO : in POSITIVE_COUNT);
Thus a call of READ or WRITE can specify a specific index value or, on the other hand, it can be omitted, in which case the normal sequential behavior will occur. This is an illustration of the use of overloading to achieve an effect similar to that of default parameters.