File io 在Ada中打开、写入和追加的过程
这个问题是对 关于在Ada中写入文件 我选择将这个问题放在一个单独的帖子中,这样更多的人就会看到它,因为我已经在前面提到的帖子中接受了一个稍微不同的问题(关于文件处理中的异常)的答案File io 在Ada中打开、写入和追加的过程,file-io,ada,procedure,File Io,Ada,Procedure,这个问题是对 关于在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_Fl
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;
在编译上述内容时,我得到一个错误,如下所示:
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;
新的 我对代码进行了如下修改:
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。对不起,伙计们,我不知道在这里放什么
我非常感谢你的帮助。谢谢关于Ada中的纯
字符串
的事情是,一个特定的字符串,比如你的文件名
,必须是固定长度的;但是不同的字符串可以有不同的长度
你可以写
S1 : String := "1234";
S2 : String := "12345";
S1 := "abcd";
在这种情况下,S1的长度为4,分配给它的长度必须为4。你可以写
S1 : String := "1234";
S2 : String := "12345";
S1 := "abcd";
但是如果你想写
S1 := "pqrst";
或
您将得到一个约束\u错误
对于子程序的字符串参数,如Open_Data
,字符串参数Name
具有长度——当然还有值!调用中实际参数的。所以你可以说
Open_Data (X_File, "x.dat");
Open_Data (Y_File, "a_very_long_name.dat");
你之前和我有问题
procedure Open_Data(File : in out Seq_Float_IO.File_Type;
Name : in String) is
begin
Seq_Float_IO.Open (File => File,
Mode => Seq_Float_IO.Append_File,
Name => ????);
我不愿意只告诉你答案,所以——考虑<代码>文件= >文件< /代码>部分。第一个文件
是Seq_Float_IO.Open
的形式参数的名称,第二个文件
是要传递的,在本例中是Open_Data
的文件
参数
如果我指出我可以把上面的电话写成
Open_Data (File => X_File, Name => "x.dat");
Open_Data (File => Y_File, Name => "a_very_long_name.dat");
@西蒙·赖特的答案是正确的,你可能会发现将他的答案与我之前写的答案进行比较是有帮助的。注意,如果你有
Name_X : constant String := "domainvalues.dat";
Name_Y : constant String := "ordinatevalues.dat";
字符串Name\u X
或Name\u Y
,都可以用作打开数据的实际Name
参数。形式参数Name
,类型为String
<代码>字符串
是无约束的,它可以是任何(实现定义的)最大长度。相比之下,Name_X
和Name_Y
都有一个由初始分配确定的固定长度
附录:您编写了一个子程序,其形式参数(Name
)类型为String
,具有此签名
procedure Open_Data(
File : in out Seq_Float_IO.File_Type;
Name : in String) is ...
在实现中,您希望将作为实际参数(Name
)收到的String
转发到Open
,而不是全局常量的名称(Name\u X
)
谢谢你对字符串的解释。我在一本书中看到了一个例子,其中包含:File\u Name:CONSTANT String:=“one\u File\u Only.dat”,正如我在文章中提到的那样……但当然,将其扩展到任何字符串都会有所帮助。再次感谢。你到底为什么继续在调用Open中编写
Name=>Name_X
?您认为Open\u Data
的参数有什么意义?使用文件
做正确的事情,现在使用名称
做正确的事情。写Name=>Name
。删除Name\u X
,Name\u Y
。在调用Open\u Data
时,将所需的实际文件名作为文本字符串传递(格式请参见下面的答案)。非常感谢您对我的耐心。是的,我知道,输入Name\u X会破坏为Open和write过程创建过程的目的。我只是不知道该放什么。Ada中的文件IO似乎很难,我需要更仔细地研究这一部分。书中的例子并不全面……它们倾向于简单的文件操作。我认为,为了简化代码,我去掉Name_X&Name_Y并按照您的建议传递实际的文件名是一件好事。但是我会保留这两个版本,这样我就可以从错误中吸取教训。re:耐心——很抱歉,时间太晚了&我不知道哪一部分是症结所在。不管怎样,这一关已经过去了,祝你下一关好运!是的,我知道把Name_X放在这里会破坏为open和write过程创建过程的意义。我只是不知道该放什么。Ada中的文件IO似乎很难,我需要更仔细地研究这一部分。书中的例子并不全面……他们倾向于坚持严格的向前文件操作。投票结束。我开始真的喜欢艾达了。我主要使用C语言和Matlab。Ada有助于避免科学计算中其他语言中容易出现的错误。然而,很少有教科书展示Ada在数值计算中的应用。ADA2005为矩阵运算带来了新的工具,比如特征值的计算,这在我的任务清单上。再次感谢。我特别喜欢Ada冗长的风格。来自C语言的Ada感觉冗长,但这对程序的可维护性有很大帮助。现在我也养成了写长而有意义的变量名的好习惯,这是我在用C@ycallecharan写时没有做的事情!您还可以欣赏以下Ada示例: