2010-07-03 17 views
1

我在学习Ada,我需要对文件操作进行一些说明。我只有一种类型:浮动,我必须创建2个文件,将存储浮动值(附加操作)。所以我实例化一个float类型的包,然后声明2个文件变量X_File和Y_File。然后我会在文件不存在的情况下发出异常。Ada文件操作:实例化和异常

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 =>的两个字段留空。

而且我也把文件=>文件...这似乎不好!

回答

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; 
+0

感谢。有用!有关块语句很好了解。 – yCalleecharan 2010-07-03 13:28:05

+0

是的,我也会研究如何创建一个合适的子程序或程序。 – yCalleecharan 2010-07-03 13:33:57

+0

优秀!顺便说一句,“子程序”是一个函数或过程的Ada术语。因为'File_Type'是有限的私有的,所以一个过程将更直接。例如,'过程Open_Data(文件:输出Seq_Float_IO.File_Type;名称:在字符串中)是...' – trashgod 2010-07-03 13:47:34

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

再次感谢。我修改了我的帖子底部显示的代码(我删除了前面的代码)。我仍然不知道要在Name =>中写些什么,正如我在帖子中写到的那样。我传入一个字符串...它是文件名吗? – yCalleecharan 2010-07-03 16:46:28

+0

而我也把文件=>文件...这似乎不好! – yCalleecharan 2010-07-03 17:00:33

+0

我为此问题创建了另一个帖子: http://stackoverflow.com/questions/3172364/procedure-to-open-write-and-append-in-ada – yCalleecharan 2010-07-03 18:15:22