Добавить файл операции в Аде - PullRequest
2 голосов
/ 02 июля 2010

Я очень плохо знаком с Ada, и мне трудно понять одну вещь - работать с файлами в Ada, когда дело доходит до добавления некоторых значений в файл.Мне кажется, в Си легче сделать это. В любом случае, я не нашел хорошей информации, и я надеюсь, что кто-то может мне здесь помочь.

Сначала я объявляю следующее:

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;

При компиляции я получаю:

исключение

когда Name_Error => |

«Name_Error» не видимое невидимое объявление в a-sequio.ads:111, экземпляр в строке 5 не-видимое объявление в a-textio.ads:298 невидимое объявление в a-ioexce.ads:23

Create (File => Flo_File), Mode => Out_File, Name => "bvalues.dat");|

«Создать» - невидимое невидимое объявление в a-sequio.ads:73, экземпляр в строке 5 - невидимое объявление в a-textio.ads:90

15.

Это не изменится, если я вместо Seq_Float_IO.Out_File добавлю также Seq_Float_IO.Out_Fileпросто Out_File.

1 Ответ

3 голосов
/ 02 июля 2010

Создать, как следует из названия, создаст новый файл, даже если он уже существует.

Если файл уже существует и вы хотите добавить к нему, вы должны использовать 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;

Из остальной части вашего текста похоже, что вы думаете о сохранении временных значений в файле.Я бы не стал этого делать, если вам по какой-то причине не нужно настойчивость (восстановление после сбоев и т. Д.).Диск ввода-вывода является медленным , , .Просто сохраните свои временные значения в переменной и сохраните результат, когда он у вас есть.

...