我正在学习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 =>文件......这似乎没有问题!!!
答案 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 => ...);