Ада: добавление исключения в отдельной процедуре при чтении файла - PullRequest
0 голосов
/ 21 марта 2012

Это продолжение этого вопроса: Ада: чтение из файла .

Я хотел бы добавить 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

Как это исправить?

Большое спасибо ...

Обновление :

Я внес следующие исправления:

  1. В test_read.adb, Теперь у меня есть procedure Open_Data (File : in out Ada.Text_IO.File_Type; Name : in String) is separate;

  2. Обновлено определение той же самой процедуры Open_Data в test_read-open_data.adb.

Программа компилируется хорошо, хотя я не вижу, чтобы она ловила исключение, скажем, если я переименовал файл fx.txt в fy.txt.Я получаю сообщение об ошибке: просто

raised ADA.IO_EXCEPTIONS.NAME_ERROR : fx.txt: No such file or directory

Поэтому я не получаю свое собственное сообщение об ошибке: Файл не найден .

Что по-прежнему не так?

Ответы [ 4 ]

3 голосов
/ 21 марта 2012

Параметр File в Open_Data должен быть параметром in out (как, например, Ada.Text_IO.Create), потому что вы хотите, чтобы открытый файл был доступен в Test_Read.

Вы получаете actual for "File" must be a variable, потому что параметр in доступен только для чтения.

procedure Open_Data (File : in out Ada.Text_IO.File_Type; 
                     Name : in     String) is

(Лично я редко набираю режим in, потому что он используется по умолчанию).

Нов любом случае, похоже, что причина наблюдаемого поведения в том, что Test_Read на самом деле не вызывает Open_Data!

(отредактировано, чтобы сделать рекомендованный режим in out & чтобы предложить позвонить Open_Data)

1 голос
/ 21 марта 2012

если ваша цель просто проверить, существует ли файл, рассмотрите возможность использования Ada.Directories.Exists

0 голосов
/ 23 марта 2012

Я подозреваю, что причина, по которой вы не видите свое сообщение об ошибке, заключается в том, что вы используете Put, а не Put_Line.Различные реализации / платформы по-разному обрабатывают вывод на экран пользователя.Чтобы быть уверенным, что вы увидите сообщение, следуйте Put_Line с Get_Line.Get_Line обычно вызывает вывод Put_Line.

0 голосов
/ 21 марта 2012

IIRC: Standard_Error - это не файл, а поток.

...