我是Ada的新手,我发现很难理解的一件事就是在文件中附加一些值时使用Ada中的Files。在C中这样做似乎更容易。无论如何,我没有找到好的信息,我希望有人可以帮助我。
我首先声明如下:
PACKAGE Seq_Float_IO IS NEW Ada.Sequential_IO (Element_Type => Long_Float);
Flo_File : Seq_Long_Float_IO.File_Type;
然后我创建了一个文件“bvalues.dat”:
Seq_Long_Float_IO.Create(File => Flo_File, Name => "bvalues.dat");
然后写一个名为“Largest”的变量,我用:
Seq_Long_Float_IO.Write(File => Flo_File, Item => Largest);
我看到每次运行代码时,文件“bvalues.dat”都会被销毁,并在程序运行时将新值写入其中。这对我来说没问题。我在代码中所做的是找到某些值的最大值并将最大元素存储在文件“bvalues.dat”中。
现在说我必须在同一个程序中使用不同的值集重复操作(比如使用外部LOOP),我需要存储每组值的最大元素。因此,我需要能够将每个集合的每个最大值附加到文件“bvalues.dat”。怎么做到这一点?
我是否需要在每次写入最大值后关闭文件“bvalues.dat”,然后再次打开它:
Seq_Long_Float_IO.Open(File => Flo_File, Mode => Append_File, Name => "bvalues.dat");
说外循环中的索引递增后接收要计算最大元素的下一组值,然后像我上面那样写
Seq_Long_Float_IO.Write(File => Flo_File, Item => Largest); ?
新信息:
我收到错误:
40. Seq_Long_Float_IO.Open(File => Flo_File, Mode => Append_File, Name => "bvalues.dat");
|
>>> "Append_File" is not visible
>>> non-visible declaration at a-sequio.ads:58, instance at line 8
>>> non-visible declaration at a-textio.ads:56
非常感谢...
测试文件:
WITH Ada.Text_IO;
WITH Ada.Sequential_IO;
PROCEDURE TestWrite5 IS
PACKAGE Seq_Float_IO IS NEW Ada.Sequential_IO (Element_Type => Float);
Flo_File : Seq_Float_IO.File_Type;
BEGIN
Seq_Float_IO.Open (File => Flo_File, Mode => Seq_Float_IO.Append_File,
Name =>"bvalues.dat");
exception
when Name_Error =>
Create (File => Flo_File, Mode => Out_File, Name => "bvalues.dat");
END TestWrite5;
编译时我得到:
例外
当Name_Error => |
“Name_Error”不可见 a-sequio.ads:111上的不可见声明,第5行的实例 a-textio.ads:298上的不可见声明 a-ioexce.ads:23上的不可见声明
创建(File => Flo_File,Mode => Out_File,Name =>“bvalues.dat”); |
“创建”不可见 在a-sequio.ads:73处的不可见声明,第5行的实例 a-textio.ads:90上的不可见声明
15
如果我也放置Seq_Float_IO.Out_File而不是Out_File,它不会改变。
答案 0 :(得分:3)
创建,就像名称所暗示的那样,将创建一个全新的文件,即使已存在。
如果该文件已存在且您想要附加到该文件,则可以使用Open
。
如果要打开它以进行追加,但如果它不存在则创建它,正常的习惯用法是将Create
调用放在Open
周围的异常处理程序中,如下所示:< / p>
begin
Open (File => Flo_File, Mode => Append_File, Name => "bvalues.dat");
exception
when Name_Error =>
Create (File => Flo_File, Mode => Out_File, Name => "bvalues.dat");
end;
在文本的其余部分中,您似乎正在考虑将临时值存储在文件中。除非你出于某种原因需要持久性(从崩溃中恢复等),否则我不会这样做。磁盘IO的方式方式 方式慢。只需将您的临时值保存在变量中,并在拥有它时保存结果。