Ада файловая операция: создание и исключение - PullRequest
1 голос
/ 03 июля 2010

Я изучаю Аду, и мне нужны некоторые пояснения по файловым операциям. У меня есть только один тип: float, и мне нужно создать 2 файла, которые будут хранить значения с плавающей запятой (с операцией добавления). Поэтому я создаю экземпляр пакета для типа float, а затем объявляю 2 файловые переменные X_File и Y_File. Затем я помещаю исключения на случай, если файлы еще не существуют.

WITH Ada.Text_IO;
WITH Ada.Sequential_IO;

PROCEDURE TestWrite6 IS
   PACKAGE Seq_Float_IO IS NEW Ada.Sequential_IO (Element_Type => Float);
   X_File : Seq_Float_IO.File_Type;
   Y_File : Seq_Float_IO.File_Type;


BEGIN

 Seq_Float_IO.Open (File => X_File, Mode => Seq_Float_IO.Append_File, 
 Name => "xvalues.dat");
 exception
 when Seq_Float_IO.Name_Error =>
  Seq_Float_IO.Create (File => X_File, Mode => Seq_Float_IO.Out_File, 
  Name =>  "xvalues.dat");

 Seq_Float_IO.Open (File => Y_File, Mode => Seq_Float_IO.Append_File, 
 Name => "yvalues.dat");
 exception
 when Seq_Float_IO.Name_Error =>
  Seq_Float_IO.Create (File => Y_File, Mode => Seq_Float_IO.Out_File, 
  Name => "yvalues.dat");

END TestWrite6;

У меня есть два отдельных исключения для каждого файла xvalues.dat и yvalues.dat. Теперь при компиляции я получаю сообщение об ошибке:

16.
17.    Seq_Float_IO.Open (File => Y_File, Mode => Seq_Float_IO.Append_File, Name => "xvalues.dat");
18.    exception
       |
    >>> exception handler not permitted here

19.    when Seq_Float_IO.Name_Error =>

Кажется, у меня может быть только одно исключение для xvalues.dat, а не второе для yvalues.dat. Что я делаю не так?

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


Некоторые изменения: написать общую процедуру для открытия и добавления значений в файл:

WITH Ada.Sequential_IO;
WITH Ada.Float_Text_IO;

PROCEDURE TEST is

package Seq_Float_IO is new Ada.Sequential_IO (Element_Type => Float);
X_File : Seq_Float_IO.File_Type;


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

BEGIN

   begin
      Seq_Float_IO.Open (
         File => File,
         Mode => Seq_Float_IO.Append_File,
         Name =>  );
    exception
      when Seq_Float_IO.Name_Error =>
         Seq_Float_IO.Create (
           File => File,
           Mode => Seq_Float_IO.Out_File,
           Name =>  );
   end;

END Open_Data;


x        : CONSTANT Float := 2.0;


BEGIN --main program
   Open_Data(X_File, "xvalues.dat");
   Seq_Float_IO.Write(File => X_File,Item => x);

   Seq_Float_IO.Close(File => X_File);
END TEST;

В процедуре Open_Data. Я оставил 2 поля для Name => незаполненными, так как не знаю, что туда вставить.

И я также положил File => File ... это не так хорошо !!!

Ответы [ 2 ]

1 голос
/ 03 июля 2010

Данная последовательность операторов может иметь только один набор обработчиков исключений . Один из подходов заключается в том, чтобы обернуть каждую обработанную последовательность операторов в отдельный блок , как показано ниже. Отметив общие операторы в каждом блоке, рассмотрите возможность написания короткой подпрограммы, которая может открыть или создать файл по имени и обработать любые возникающие исключения.

with Ada.Sequential_IO;

procedure TestWrite6 is
   package Seq_Float_IO is new Ada.Sequential_IO (Element_Type => Float);
   X_File : Seq_Float_IO.File_Type;
   Y_File : Seq_Float_IO.File_Type;

begin
   begin
      Seq_Float_IO.Open (
         File => X_File,
         Mode => Seq_Float_IO.Append_File,
         Name => "xvalues.dat");
   exception
      when Seq_Float_IO.Name_Error =>
         Seq_Float_IO.Create (
            File => X_File,
            Mode => Seq_Float_IO.Out_File,
            Name =>  "xvalues.dat");
   end;
   begin
      Seq_Float_IO.Open (
         File => Y_File,
         Mode => Seq_Float_IO.Append_File, 
         Name => "yvalues.dat");
   exception
      when Seq_Float_IO.Name_Error =>
         Seq_Float_IO.Create (
            File => Y_File,
            Mode => Seq_Float_IO.Out_File, 
            Name => "yvalues.dat");
   end;
end TestWrite6;
0 голосов
/ 03 июля 2010

Дополнительный вопрос: Вам все еще нужны переменные типа Seq_Float_IO.File_Type в TestWrite6.Для метода с такой подписью:

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

вам понадобятся эти объявления для параметра in out:

X_File : Seq_Float_IO.File_Type;
Y_File : Seq_Float_IO.File_Type;

, и вы будете использовать их следующим образом:

Open_Data(X_File, "xvalues.dat");
Open_Data(Y_File, "yvalues.dat");
Seq_Float_IO.Write(File => X_File, Item => ...);
Seq_Float_IO.Write(File => Y_File, Item => ...);
...