【问题标题】:Ada file operation: instantiation and exceptionAda 文件操作:实例化和异常
【发布时间】:2010-07-03 11:23:40
【问题描述】:

我正在学习 Ada,我需要对文件操作进行一些说明。我只有一种类型:float,我必须创建 2 个存储浮点值的文件(使用附加操作)。所以我为浮点类型实例化了一个包,然后我声明了 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 => 的 2 个字段留空,因为我不知道该放什么。

而且我还放了 File => File...这似乎不行!!!

【问题讨论】:

    标签: file exception ada


    【解决方案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;
    

    【讨论】:

    • 是的,我还将研究如何创建合适的子程序或过程。
    • 太棒了!顺便说一句,subprogram 是 Ada 术语,表示函数或过程。因为File_Type 是有限私有的,所以过程会更直接。例如,procedure Open_Data(File : in out Seq_Float_IO.File_Type; Name : in String) is ...
    • 谢谢。请参阅我制作的代码(在我的帖子底部)。它不编译。如果您能提供一些启发,那将是非常好的。
    • @yCalleecharan:为了清楚起见,我已经在单独的答案中做出了回应。
    【解决方案2】:

    后续问题:TestWrite6 中仍然需要有 Seq_Float_IO.File_Type 类型的变量。给定具有此签名的方法:

    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 => ...);
    

    【讨论】:

    • 再次感谢。我修改了帖子底部显示的代码(我删除了以前的代码)。正如我在帖子中所写的那样,我仍然不知道在 Name => 中输入什么。我传入一个字符串...是文件名吗?
    • 我为这个问题创建了另一个帖子:stackoverflow.com/questions/3172364/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2011-03-11
    • 1970-01-01
    • 2012-09-12
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多