代码之家  ›  专栏  ›  技术社区  ›  yCalleecharan

在Ada中打开、编写和附加的过程

  •  2
  • yCalleecharan  · 技术社区  · 16 年前

    这个问题是对

    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;
    

    在编译上述内容时,我得到如下错误:

    1. X_文件:Seq_Float_IO.File_Type;
      1. 文件名:String;

        不允许不受约束的子类型(需要初始化) 提供初始值或显式数组边界

    我不知道两件事:

    1. 我有文件名:String;因为我想写不同的文件。所以我想要一个普通的字符串,而不是:

    文件名:常量字符串:=“一个\u文件\u Only.dat”

    1. 将过程Open\u数据保存在单独的ads和adb(对于body)文件中是否更好?


    新建。。。

    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 );
    

    2 回复  |  直到 9 年前
        1
  •  3
  •   Simon Wright    16 年前

    关于平原的事 String File_Name ,必须是固定长度;但是不同的弦可以有不同的长度。

    你可以写

    S1 : String := "1234";
    S2 : String := "12345";
    

    在这种情况下,S1的长度是4,分配给它的长度必须是4

    S1 := "abcd";
    

    但如果你想写

    S1 := "pqrst";
    

    S1 := S2;
    

    你会得到一个 Constraint_Error .

    对于子程序的字符串参数,如 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 => ????);
    

    我不愿意直接告诉你答案,所以——考虑一下 File => File 部分。第一个 File 的形式参数的名称 Seq_Float_IO.Open 文件 在这种情况下,通过的是什么 打开\u数据 的 文件 参数。

    Open_Data (File => X_File, Name => "x.dat");
    Open_Data (File => Y_File, Name => "a_very_long_name.dat");
    
        2
  •  2
  •   Community Mohan Dere    9 年前

    @西蒙·赖特的答案是正确的,你可能会发现将他的答案与 second one 我之前写过。注意如果你有

    Name_X : constant String := "domainvalues.dat";
    Name_Y : constant String := "ordinatevalues.dat";
    

    任何一根弦, Name_X 或 Name_Y Name 参数到 Open_Data . 形式参数, 姓名 ,属于类型 String . 字符串 姓名\u X 和 姓名(Y) 每一个都有一个固定的长度,由它们的初始赋值决定。

    姓名 ,有这个签名

    procedure Open_Data(
        File : in out Seq_Float_IO.File_Type;
        Name : in String) is ...
    

    Open 这个 作为实际参数接收( 姓名 姓名\u X

    Seq_Float_IO.Open (
        File => File,
        Mode => Seq_Float_IO.Append_File,
        Name => Name );