File io 在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

这个问题是对

关于在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;
在编译上述内容时,我得到一个错误,如下所示:

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;
  • X_文件:Seq_Float_IO.File_类型;
  • 文件名:字符串; | 不允许不受约束的子类型(需要初始化) 提供初始值或显式数组边界

  • 我不知道两件事:

  • 我有文件名:String;因为我希望能够写入不同的文件。所以我想要一个通用字符串,而不是类似于:
  • 文件名:常量字符串:=“仅一个文件.dat”

  • 将过程Open_数据保存在单独的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。对不起,伙计们,我不知道在这里放什么


    我非常感谢你的帮助。谢谢

    关于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示例: