------------------------------------------------------------------------------ -- Normal textual input and output is accomplished using the pacakge -- Ada.Text_IO. The following I/O routines are taken from that package file : File_Type; begin Open(File => file, Name => "/usr/local/widgets/data", Mode => In_File); exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; ------------------------------- file : File_Type; length : Natural; line : String(1..1024); -- some string large enough to hold any line in -- the file begin Open(File => file, Name => "/usr/local/widgets/data", Mode => In_File); while not End_Of_File(file) loop Get_Line(File => file, Item => line, Last => length); Put_Line(Item => line(1..length)); -- writes to stdout end loop; Close(file); exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, -- writes to stderr Item => "You do not have permission to open the file"); end; ------------------------------- num : float; while not End_Of_File loop begin Get(Item => num); -- read a float from stdin Put_Line(float'Image(num)); -- write to stdout exception when Data_Error =. Put(File => Standard_Error, -- write to stderr Item => "File contains non-numeric data"); Skip_Line; -- skip the rest of the current input line end; end loop; ------------------------------- logfile : File_Type; begin Open(File => logfile, Name => "/tmp/log", Mode => Out_File); -- open for output exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, -- writes to stderr Item => "You do not have permission to open the file"); end; ------------------------------- oldfile : File_Type; oldfile := Current_Output; -- save old file handle Set_Output(logfile); -- switch standard output Put_Line("Countdown initiated ..."); Set_Output(oldfile); -- return to original output Put_Line("You have 30 seconds to reach maximum safety distance."); ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ source : file_type; sink : file_type; -- open file for reading begin Open(File => source, Name => path, Mode => In_File); exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; -- open file for writing begin Open(File => sink, Name => path, Mode => Out_File); exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; -- Open file for writing, creating a new file begin Create(File => sink, Name => path); exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; ------------------------------- -- You must instantiate the package Ada.Direct_Io to perform both input -- and output on a file. package dir_text is new Ada.Direct_Io(Character); use dir_text; direct : File_Type; begin Open(File => direct, Name => path, Mode => InOut_File); exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; ------------------------------- sink : File_Type; begin Open(File => sink, Name => path, Mode => Append_File); exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ -- Ada does not provide any rules about file names. Unusual file names are -- opened the same as common file names. ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ -- Ada provides no facilities for expanding tildes in file names. ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ -- (The Ada equivalent) sink : File_Type; begin Open(File => sink, Name => path, Mode => Append_File); exception when Name_Error => Put(File => Standard_Error, Item => "File " & path " not found."); when Status_Error => Put(File => Standard_Error, Item => "File " & path & " already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open file " & path); end; ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ -- Passing in a null string for the file name creates a temporary file begin Create(File => sink, Name => ""); exception when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ -- Not allowed in Ada. ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ line : String(1..256); length : Natural; while not End_Of_File loop Get_Line(Item => line, Last => length); -- ... -- do something with the input line end loop; ------------------------------- -- The GNAT extension package Gnat.Command_Line provides some high level -- command line parsing capabilities. -- Simple command line parsing is provided by the standard package -- Ada.Command_Line. source : File_Type; for argnum in 1..Argument_Count loop begin Open(File => Source, Name => Argument(argnum), Mode => In_File); while not End_Of_File(source) loop -- process the file from the command line end loop; exception when Name_Error => Put(File => Standard_Error, Item => "File name not found."); when Status_Error => Put(File => Standard_Error, Item => "File already open."); when Use_Error => Put(File => Standard_Error, Item => "You do not have permission to open the file"); end; end loop; ------------------------------- -- arg demo 1: Process optional -c flag loop case GetOpt("-c") is when ASCII.NUL => exit; -- exit loop when 'c' => -- set whatever internal flag corresponds to the "-c" option when Others => raise Program_Error; -- cannot occur! end case; end loop; ------------------------------- -- arg demo 2: Process optional -NUMBER flag loop case GetOpt("1 2 3 4 5 6 7 8 9") is when ASCII.NUL => exit; when '1' => -- process 1 when '2' => -- process 2 when '3' => -- process 3 when '4' => -- process 4 when '5' => -- process 5 when '6' => -- process 6 when '7' => -- process 7 when '8' => -- process 8 when '9' => -- process 9 when Others => raise Program_Error; end case; end loop; ------------------------------- -- arg demo 3: Process clustering -a, -i, -n, or -u flags loop case Get_Opt("a i n u") is when ASCII.NUL => exit; when 'a' => append := true; when 'i' => ignore_ints := true; when 'n' => nostdout := true; when 'u' => unbuffer := true; when Others => raise Program_Error; end case; end loop; ------------------------------------------------------------------------------ |
------------------------------------------------------------------------------ -- Ada has no "rename" built in. It can, however, call existing programs -- to achieve the same purpose. with Interfaces.C; use Interfaces.C; procedure Rename_File(From, To : String) is function system(Command : Char_Array) return Int; pragma Import(C, system, "system"); rc : Int; begin rc := system(To_C("mv " & From & " " & To)); end Rename_File; ------------------------------- Open(File => Old, Name => old_file, Mode => In_File); Create(File => New, Name => new_file); while not End_Of_File(Old) loop Get_Line(File => Old, Item => Line, Last => Length); -- process the data in Line Put_Line(File => New, Item => Line(1..Length)); end loop; Close(Old); Close(New); Rename_File(old_file, old_file & ".orig"); Rename_File(new_file, old_file); ------------------------------------------------------------------------------ |