本文介绍了在Ada中打开,写入和追加的过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题是后续的帖子在



关于在Ada中写入文件



我选择将这个问题放在一个单独的帖子中,以便更多人可以看到这个问题,因为我已经接受了一个稍有不同的问题(这是文件处理中的例外情况) 。

  

在Ada中,普通的 String 字符串,如 File_Name ,必须是固定长度的;但是不同的字符串可以有不同的长度。



您可以写

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

在这种情况下,S1的长度是4,分配的长度必须是4。可写

  S1:=abcd; 

但如果您尝试写入

  S1:=pqrst; 

  S1:= S2; 

你会得到一个 Constraint_Error p>

对于子程序的字符串参数(例如 Open_Data ),String参数 Name 需要长度 - 当然还有值!呼叫中的实际参数。所以你可以说:
$ b $ pre $ Open_Data(X_File,x.dat);
Open_Data(Y_File,a_very_long_name.dat);

您之前遇到过问题

<$ p (File:in FileSeq_Float_IO.File_Type;
Name:in String)是
begin
Seq_Float_IO.Open(File => File,
Mode => Seq_Float_IO.Append_File,
Name => ????);

我不愿意告诉你答案,所以考虑 File =>文件部分。第一个 File 是 Seq_Float_IO.Open 的形式参数的名字,第二个 File 是什么被传递,在这种情况下 Open_Data 的 File 参数。 / p>

如果我指出我可以将上面的调用写成

  Open_Data(File => X_File,Name =>x.dat); 
Open_Data(File => Y_File,Name =>a_very_long_name.dat);


This question is a follow-up of the post at

Ada file operation: instantiation and exception

about writing to files in Ada.

I chose to place this question in a separate post so that it'll become visible to more people as I already accepted an answer on a slightly different issue (which was on exceptions in file handling) in that aforementioned post.

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;

On compiling the above I get an error as follows:

  1. X_File : Seq_Float_IO.File_Type;

    1. File_Name : String; |

I don't know 2 things:

  1. I have File_Name : String; as I want to be able to write to different files. So I want a general string and not something like:

File_Name : CONSTANT String := "one_File_Only.dat"

  1. Would it be better to save the procedure Open_Data in separate ads and adb (for the body) files?

Thanks a lot...


NEW...

I've modified the code as follows:

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;

As you see I have

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

I have put Name_X as the parameter that Name is taking but this is not right as I should be able to pass in a general name which can be either Name_X or Name_Y. Sorry guys, I can't figure out what to put here.

I would much appreciate your help. Thanks

解决方案

The thing about plain String in Ada is that a particular string, like your File_Name, has to be fixed-length; but different Strings can be of different length.

You can write

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

in which case S1 is of length 4, and assignments to it have to be of length 4. You can write

S1 := "abcd";

but if you try to write

S1 := "pqrst";

or

S1 := S2;

you will get a Constraint_Error.

In the case of String parameters to subprograms, like your Open_Data, the String parameter Name takes on the length -- and of course the value! of the actual parameter in the call. So you can say

Open_Data (X_File, "x.dat");
Open_Data (Y_File, "a_very_long_name.dat");

You were having problems earlier with

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

I'm reluctant to just tell you the answer, so -- consider the File => File part. The first File is the name of the formal parameter of Seq_Float_IO.Open and the second File is what is to be passed, in this case Open_Data's File parameter.

It might help if I point out that I could have written the calls above as

Open_Data (File => X_File, Name => "x.dat");
Open_Data (File => Y_File, Name => "a_very_long_name.dat");

这篇关于在Ada中打开,写入和追加的过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 20:02