Ada文件操作:实例化和异常

时间:2010-07-03 11:23:40

标签: file exception ada

我正在学习Ada,我需要对文件操作做一些澄清。我只有一种类型: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提供1个异常,而对于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中。我为Name =>留下了两个字段空白,因为我不知道该放在那里。

我还把File =>文件......这似乎没有问题!!!

2 个答案:

答案 0 :(得分:1)

给定的sequence of statements只能有一组exception handlers。一种方法是将每个处理的语句序列包装在自己的block中,如下所示。注意每个块中的常见语句,考虑编写一个可以按名称打开或创建文件的短子程序,并处理出现的任何异常。

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;

答案 1 :(得分:0)

后续问题:您仍然需要在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 => ...);