Это продолжение этого вопроса: Ада: чтение из файла .
Я хотел бы добавить exception
, который проверяет, является ли файл, который яОткрытие действительно существует или нет.Я сделал separate
процедуру, чтобы избежать беспорядка кода.
Вот основной код test_read.adb
:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Float_Text_IO;
procedure Test_Read is
Input_File : File_Type;
Value : Long_Float;
procedure Open_Data (File : in Ada.Text_IO.File_Type; Name : in String) is separate;
begin
Ada.Text_IO.Open (File => Input_File, Mode => Ada.Text_IO.In_File, Name => "fx.txt");
while not End_Of_File (Input_File) loop
Ada.Long_Float_Text_IO.Get (File => Input_File, Item => Value);
Ada.Long_Float_Text_IO.Put (Item => value, Fore => 3, Aft => 5, Exp => 0);
Ada.Text_IO.New_Line;
end loop;
Ada.Text_IO.Close (File => Input_File);
end Test_Read;
А вот тело separate
test_read-open_data.adb
процедура Open_Data
:
separate(test_read)
procedure Open_Data (File : in out Ada.Text_IO.File_Type;
Name : in String) is
--this procedure prepares a file for reading
begin
begin
Ada.Text_IO.Open
(File => File,
Mode => Ada.Text_IO.In_File,
Name => Name);
exception
when Ada.Text_IO.Name_Error =>
Ada.Text_IO.Put(File => Standard_Error, Item => "File not found.");
end;
end Open_Data;
При компиляции я получаю сообщение об ошибке в separate
теле test_read-open_data.adb
:
actual for "File" must be a variable
Как это исправить?
Большое спасибо ...
Обновление :
Я внес следующие исправления:
В test_read.adb
, Теперь у меня есть procedure Open_Data (File : in out Ada.Text_IO.File_Type; Name : in String) is separate;
Обновлено определение той же самой процедуры Open_Data
в test_read-open_data.adb
.
Программа компилируется хорошо, хотя я не вижу, чтобы она ловила исключение, скажем, если я переименовал файл fx.txt
в fy.txt
.Я получаю сообщение об ошибке: просто
raised ADA.IO_EXCEPTIONS.NAME_ERROR : fx.txt: No such file or directory
Поэтому я не получаю свое собственное сообщение об ошибке: Файл не найден .
Что по-прежнему не так?