【问题标题】:Append file operation in Ada在 Ada 中追加文件操作
【发布时间】:2011-03-11 05:25:11
【问题描述】:

我对 Ada 很陌生,我发现很难掌握的一件事是在文件中附加一些值时使用 Ada 中的文件。我在 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");

然后写一个名为“最大”的变量,我使用:

Seq_Long_Float_IO.Write(File => Flo_File, Item => Largest);

我看到每次运行代码时,文件“bvalues.dat”都会被破坏,并且在程序运行时会向其中写入新值。这对我来说没问题。我在我的代码中所做的是找到一些值的最大值并将最大的元素存储在文件“bvalues.dat”中。

现在说我必须在同一程序中使用不同的值集重复操作(比如使用外部循环),并且我需要存储每组值的最大元素。因此,我需要能够将每个集合的每个最大值附加到文件“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;

在编译时我得到:

  1. 异常

    1. 当 Name_Error => |

      “Name_Error”不可见 a-sequio.ads:111 的不可见声明,第 5 行的实例 a-textio.ads:298 处的不可见声明 a-ioexce.ads:23 处的不可见声明

    2. 创建(文件=> Flo_File,模式=> Out_File,名称=>“bvalues.dat”); |

      “创建”不可见 a-sequio.ads:73 处的非可见声明,第 5 行的实例 a-textio.ads:90 处的不可见声明

    15.

如果我也放 Seq_Float_IO.Out_File 而不是只放 Out_File,它不会改变。

【问题讨论】:

  • 编译器错误可能表示需要将包名放在那个模式前面。类似:Seq_Long_Float_IO.Append_File。如果它不在该包中,请尝试错误消息建议的其中之一(Text_IO,Sequential_IO)。
  • 再次感谢。我得到 Seq_Long_Float_IO.Append_File 未定义。
  • 其他的怎么试?我的序言中有 Text_IO、Sequential_IO。我也试过:Seq_Long_Float_IO_Text_IO.Open。我不太了解我在这里做什么,因为我是 Ada 的新手。
  • Mode => Seq_Long_Float_IO.Append_File 为我编译 ...
  • 谢谢。但是我没有成功,请看我代码底部的那段代码。这是一个最小的例子。它有什么问题?

标签: file append ada


【解决方案1】:

Create,顾名思义,将创建一个全新的文件,即使该文件已经存在。

如果文件已经存在并且你想追加到它,你会使用Open

如果您想打开它进行附加,但如果它不存在则创建它,通常的习惯用法是将Create 调用放在Open 周围的异常处理程序中,如下所示:

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 是 way way 慢。只需将您的临时值保存在变量中并在获得结果时保存结果。

【讨论】:

  • 谢谢。但我仍然收到错误:Append_File" is not visible(请参阅我帖子的底部)。
  • 我将结果存储在文件中。如果我理解你,那么我可以将每组值写入一个数组,计算最大值,然后只将最大值写入文件。但是我必须多次执行此操作,因为程序会一个接一个地生成一个数组。
  • 是的,我同意每次打开和关闭都需要大量 CPU 资源。我想知道我是否可以只打开文件一次并附加为每个“集合”或值数组的最大值被计算出来。
  • 您对创建异常的回答非常好。这样我就不必在开始时“专门创建”文件。
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2021-07-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多