【发布时间】:2011-03-11 11:37:44
【问题描述】:
这个问题是
帖子的后续问题Ada file operation: instantiation and exception
关于在 Ada 中写入文件。
我选择将此问题放在单独的帖子中,以便更多人看到它,因为我已经在上述帖子中接受了一个稍微不同的问题(即文件处理中的异常)的答案。
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;
File_Name : String;
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 => File_Name );
exception
when Seq_Float_IO.Name_Error =>
Seq_Float_IO.Create (
File => File,
Mode => Seq_Float_IO.Out_File,
Name => 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;
在编译上面我得到一个错误如下:
- X_File : Seq_Float_IO.File_Type;
- 文件名:字符串;
|
不允许无约束的子类型(需要初始化) 提供初始值或显式数组边界
- 文件名:字符串;
|
我不知道两件事:
- 我有 File_Name : String;因为我希望能够写入不同的文件。所以我想要一个通用字符串,而不是这样的:
File_Name : CONSTANT String := "one_File_Only.dat"
- 将过程 Open_Data 保存在单独的 ads 和 adb(用于正文)文件中会更好吗?
非常感谢...
新...
我将代码修改如下:
WITH Ada.Sequential_IO;
PROCEDURE TEST1 is
package Seq_Float_IO is new Ada.Sequential_IO (Element_Type => Float);
X_File, Y_File : Seq_Float_IO.File_Type;
Name_X : CONSTANT String := "domainvalues.dat";
Name_Y : CONSTANT String := "ordinatevalues.dat";
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 => Name_X );
exception
when Seq_Float_IO.Name_Error =>
Seq_Float_IO.Create (
File => File,
Mode => Seq_Float_IO.Out_File,
Name => Name_X);
end;
END Open_Data;
x : CONSTANT Float := 2.0;
BEGIN --main program
Open_Data(File => X_File, Name => Name_X);
Seq_Float_IO.Write(File => X_File, Item => x);
Seq_Float_IO.Close(File => X_File);
Open_Data(File => Y_File, Name => Name_Y);
Seq_Float_IO.Write(File => Y_File, Item => x);
Seq_Float_IO.Close(File => Y_File);
END TEST1;
如你所见,我有
Seq_Float_IO.Open (
File => File,
Mode => Seq_Float_IO.Append_File,
Name => Name_X );
我已将 Name_X 作为 Name 所采用的参数,但这不正确,因为我应该能够传入一个通用名称,它可以是 Name_X 或 Name_Y。对不起,伙计们,我不知道该放什么。
非常感谢您的帮助。谢谢
【问题讨论】:
-
你到底为什么在 Open 调用中继续写
Name => Name_X?你觉得Open_Data的参数有什么意义?你用File做正确的事,现在用Name做正确的事。写Name => Name。删除Name_X、Name_Y。在对Open_Data的调用中将所需的实际文件名作为文字字符串传递(有关格式,请参见下面的答案)。 -
非常感谢您对我的耐心等待。
-
是的,我知道放置 Name_X 会破坏为打开和写入过程创建过程的意义。我只是不知道该放什么。 Ada 中的文件 IO 似乎很难,我需要更仔细地研究这部分。书中的例子并不全面……他们倾向于坚持简单的文件操作。
-
我认为删除 Name_X 和 Name_Y 并按照您的建议传递实际文件名以简化代码是一件好事。但我会保留这两个版本,以便从错误中吸取教训。
-
re: 耐心——很抱歉,已经很晚了,我无法弄清楚问题的哪一部分是症结所在。不管怎样,这一关已经过去了,祝你下一关好运!