如何在ADA编程中不覆盖输入/输出中的数据

时间:2019-05-31 23:27:43

标签: ada

我需要从用户那里获取输入并将数据保存在文件中,但不得覆盖数据。代码运行良好,但数据被覆盖。如何更正我的代码以获得期望的结果?

我无法设法覆盖数据。要求是:“要求用户一一输入名称,ID和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 个答案:

答案 0 :(得分:2)

执行此操作的标准方法是尝试在附加模式下打开文件,如果创建失败(同样,在附加模式下)。如果创建文件失败,您将遇到其他问题(例如,非法名称?没有权限?文件系统是只读文件?文件系统已满?在程序中这些地址都不可访问!)

注意,先打开,如果打开失败则创建;反之,文件被重置,这正是您不想要的。

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现在以附加模式打开。

   end;

为它写一些“独特”的东西,所以我们可以说它是有效的...

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

...,我们完成了。可以退出操作系统以在退出时为我们关闭文件,但是请确保。

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