Это продолжение этого вопроса: Ada: чтение из файла .
Я хотел бы добавить 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
Поэтому я не получаю собственное сообщение об ошибке: Файл не найден.
Что еще не так?
Ada.Text_IO.Open
, а не свою собственнуюOpen_Data
процедуру. - person Rommudoh   schedule 21.03.2012Ada.Text_IO.Name_Error
, вы должны ловитьAda.IO_Exceptions.Name_Error
. Полезно читать сообщения об ошибках, выдаваемые вашей программой. В этом случае ясно, что возникло исключениеAda.IO_Exceptions.Name_Error
. - person Schedler   schedule 21.03.2012ADA.IO_EXCEPTIONS.STATUS_ERROR
либо при использованииwhen Ada.Text_IO.Name_Error =>
, либо при использованииAda.IO_Exceptions.Name_Error =>
. Так что я не получаюAda.IO_Exceptions.Name_Error
. И это неправильно . Итак, как это исправить? 1 голос вверх! - person yCalleecharan   schedule 21.03.2012Ada.Text_IO.Name_Error
— это переименованиеAda.IO_Exceptions.Name_Error
. Так что подойдет любое имя. - person Simon Wright   schedule 21.03.2012