Как не перезаписать данные при вводе / выводе в программировании ADA - PullRequest
2 голосов
/ 01 июня 2019

Мне нужно принять данные от пользователя и сохранить данные в файл, но данные не должны быть перезаписаны. Код работает хорошо, но данные перезаписываются. Как исправить мой код, чтобы получить желаемые результаты?

Мне не удалось перезаписать данные. Требование: «Попросить пользователя ввести имя, идентификатор и CGPA один за другим, а затем записать их в файл. Существующих данных не должно быть». Я также пытался сохранить новые сгенерированные данные файла в другом файле, но получил тот же результат.

with Ada.Command_Line, Ada.Text_IO;
use Ada.Command_Line, Ada.Text_IO;
procedure Main is
   -- Initializing
   Read_From     : constant String := "inputFile.txt";
   Write_To      : constant String := "studentData.txt";
   name          : String (1 .. 13);
   studentID     : String (1 .. 11);
   cgpa          : String (1 .. 4);
   Input, Output : File_Type;
begin
   -- taking inputs
   Put_Line ("My Student ID Is *******bc150400162*******");
   Put_Line ("Enter the details for first student.");
   Put_Line ("Please enter your name:");
   Get (name);
   Put_Line ("Please enter your Student ID:");
   Get (studentID);
   Put_Line ("Please enter your CGPA:");
   Get (cgpa);
   -- opening file
   begin
      Open (File => Input, Mode => In_File, Name => Read_From);
   exception
      when others =>
         Put_Line
           (Standard_Error,
            "Can not open the file '" & Read_From & "'. Does it exist?");
         Set_Exit_Status (Failure);
         return;
   end;
   -- Creating new file file

   begin
      Create (File => Output, Mode => Out_File, Name => Write_To);
   exception
      when others =>
         Put_Line
           (Standard_Error, "Can not create a file named '" & Write_To & "'.");
         Set_Exit_Status (Failure);
         return;
   end;
   -- Here is the loop.............................................
   ------------------
   loop
      declare
         Line : String := Get_Line (Input);
      begin
         Put_Line (Output, Line);
         Put_Line (Output, "The Student details are: ");
         Put_Line (Output, name);
         Put_Line (Output, studentID);
         Put_Line (Output, cgpa);
      end;
   end loop;
exception
   when End_Error =>
      if Is_Open (Input) then
         Close (Input);
      end if;
      if Is_Open (Output) then
         Close (Output);
      end if;
end Main;

1 Ответ

3 голосов
/ 01 июня 2019

Стандартный способ сделать это - попытаться открыть файл в режиме добавления, а если это не удастся, создайте его (снова в режиме добавления).Если создание файла не удается, у вас есть другая проблема (например, недопустимое имя? Нет разрешений? Файловая система доступна только для чтения? Файловая система заполнена? Ни один из них не может быть адресован в вашей программе!)создать, если открыть не удалось;и наоборот, файл может быть сброшен, а это именно то, что вам не нужно.

with Ada.Text_IO;
with Ada.Calendar.Formatting;
with Ada.IO_Exceptions;
procedure Appending is
   Output : Ada.Text_IO.File_Type;
   Name : constant String := "appending.dat";
begin

Нам нужен блок здесь, поэтому здесь может быть поймано исключение.

   begin

Попробуйте открыть файл ...

      Ada.Text_IO.Open (File => Output,
                        Name => Name,
                        Mode => Ada.Text_IO.Append_File);

Open успешно!

   exception
      when Ada.IO_Exceptions.Name_Error =>

Open не удалось, поскольку имя не представляет открываемый файл.Попробуйте создать его ...

         Ada.Text_IO.Create (File => Output,
                             Name => Name,
                             Mode => Ada.Text_IO.Append_File);

Файл Output теперь открыт в режиме добавления.
(На первый взгляд, вы можете спросить, какой смысл открывать файл, который должен иметьв режиме добавления был пуст. Обычно, конечно, он также мог бы быть открыт в режиме стандартного выхода, единственное отличие было бы, если бы по какой-то причине вам пришлось использовать немодальный Reset.в этом случае, если файл был создан в режиме добавления, он останется в режиме добавления, поэтому все предыдущие обновления не будут потеряны.)

   end;

Напишите что-нибудь «уникальное» для него, чтобы мы могли сказатьэто сработало ...

   Ada.Text_IO.Put_Line
     (File => Output,
      Item => Ada.Calendar.Formatting.Image (Ada.Calendar.Clock));

... и мы закончили.Может оставить ОС, чтобы закрыть файл для нас при выходе, но давайте будем уверены.

   Ada.Text_IO.Close (File => Output);
end Appending;
...