Соответствие длины строки файла целому числу файла - PullRequest
1 голос
/ 29 мая 2020

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

      Create(F, Out_File, File_Name);
      Put_Line(F, "23709 5");
      Put_Line(F, "001 4");
      Put_Line(F, "1 1");
      Put_Line(F, "10923487283462 14");
      Put_Line(F, "22 3");

В приведенном выше сценарии, который является реальной проблемой, я хотел бы напечатать строки

001 4
22 3

, потому что они не совпадают.

Первоначально я планировал решить эту проблему путем добавления проверочной переменной, которая будет равна 10 ** контрольной сумме (последнее целое число выше) -1. Это сработало бы, если бы четвертое число не было слишком большим для чтения, и поэтому я выбрал go по пути преобразования первого целого числа в строку и попытки сопоставить его длину с целым числом контрольной суммы. Здесь я столкнулся с проблемами. Мой способ именования строки хранит числа из предыдущих строк и, к сожалению, опирается на них. И поскольку они основаны друг на друге, моя контрольная переменная не работает, потому что она не соответствует фактической длине строки, а совмещена с общей длиной строки, а затем и с некоторыми.

Вот мой код:

with ada.text_IO; use ada.text_IO;
with ada.integer_text_IO; use ada.integer_text_IO;
with ada.float_text_IO; use ada.float_text_IO;

-----------------------------------------------------------------------
-- Im supposed to read the following file and detect
-- whether or not the integer in the file following immediately after
-- the space indicates how many integer places are found
-- in the integer infront of the space. If it mismatches
-- Im supposed to print it.
----------------------------------------------------------------------
procedure exercise2 is

   F: File_Type;
   File_Name: constant String := "BAD_DIGITS.TXT";
   Space : Character;
   Checksum: Integer;
   Name : String(1..20);
   L: Integer := 0;
   Ints : Integer;
   Char : Character;

   begin

      Create(F, Out_File, File_Name);
      Put_Line(F, "23709 5");
      Put_Line(F, "001 4");
      Put_Line(F, "1 1");
      Put_Line(F, "10923487283462 14");
      Put_Line(F, "22 3");

      Close(F);

      Open(F, In_File, File_Name);

      while not End_Of_File(F) loop
     while not End_Of_Line(F) loop
        loop
           Get(F, Char);
           L := L+1;
           if Char = ' ' then
          exit;
           else
          Name(L) := Char;
           end if;
        end loop;
        Get(F, Checksum);
        if L-1 > Checksum then
           Put(Name);
           Put(" ");
           Put(Checksum, Width =>0);
           New_Line;
           L := 0;
        end if;
     end loop;
     Skip_Line(F);
      end loop;




end exercise2;

Я весь день просидел с этой проблемой и надеюсь, что кто-нибудь даст конструктивный отзыв, чтобы освободить мой разум.

1 Ответ

1 голос
/ 29 мая 2020

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

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Main is
   F: File_Type;
   File_Name: constant String := "BAD_DIGITS.TXT";
   Space : constant Character :=  ' ';
   Checksum: Integer;
   Value : String(1..20);
   L: Integer := 0;
   Char : Character;
begin
   Create(F, Out_File, File_Name);
   Put_Line(F, "23709 5");
   Put_Line(F, "001 4");
   Put_Line(F, "1 1");
   Put_Line(F, "10923487283462 14");
   Put_Line(F, "22 3");

   Close(F);

   Open(F, In_File, File_Name);

   while not End_Of_File(F) loop
      L := 0;
      loop
         Get(File => F,
             Item => Char);
         if Char /= Space then
            L := L + 1;
            Value(L) := Char;
         else
            exit;
         end if;
      end loop;
      Get(F, Checksum);  -- Uses Ada.Integer_Text_Io
      if Checksum /= L then
         Put_Line(Value(1..L) & Checksum'Image);
      end if;

   end loop;
 end main;
...