Я работал с назначениями файлов и столкнулся с сложной проблемой, когда мне нужно было прочитать номера файлов и сопоставить их, сравнивая первое целое число со вторым, разделенное пробелом. Если последнее число больше, чем количество составляющих в первом, я должен их распечатать.
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;
Я весь день просидел с этой проблемой и надеюсь, что кто-нибудь даст конструктивный отзыв, чтобы освободить мой разум.