2

私は 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");

そして、「Largest」という名前の変数を書くには、次を使用します。

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.

Out_File の代わりに Seq_Float_IO.Out_File を入れても変わりません。

4

1 に答える 1

3

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 はかなり遅いです 一時値を変数に保持し、結果が得られたら保存します。

于 2010-07-02T18:35:48.647 に答える