Как проверить, какие строки равны в двух текстовых файлах? - PullRequest
0 голосов
/ 22 апреля 2020

Это просто код работает нормально, чтобы проверить, если строки отличаются, уже когда я пытаюсь проверить, равны ли они, ни один элемент не найден, когда есть два файла с одинаковой строкой в ​​одном и том же индексе строки на обоих. Чего здесь не хватает?

PS: SameStr() также был протестирован и не работает.

function compstr(s1, s2: string): boolean;
var
  i: integer;
  btemp: boolean;
begin
  btemp := true;
  if (length(s1) <> length(s2)) then
  begin
    btemp := false;
  end
  else
  begin
    for i := 1 to length(s1) do
    begin
      if (s1[i] <> s2[i]) then
      begin
        btemp := false;
        exit;
      end;
    end;
  end;
  result := btemp;
end;

procedure compfile(filename1, filename2: string);
var
  f1: system.textfile;
  f2: system.textfile;
  diff: system.textfile;
  buf1: string;
  buf2: string;
  l: integer;
begin
  assignfile(f1, filename1);
  assignfile(f2, filename2);
  assignfile(diff, 'C:\Equals.txt');
  reset(f1);
  reset(f2);
  rewrite(diff);
  l := 1;
  while not eof(f1) do
  begin
    readln(f1, buf1);
    readln(f2, buf2);
    if {not} compstr(buf1, buf2) then
    begin
      writeln(diff, {extractfilename(filename1) + ' : ' +} inttostr(l) + ' - ' + buf1);
     // writeln(diff, extractfilename(filename2) + ' : ' + inttostr(l) + ' - ' + buf2);
     // writeln(diff, ' ');
    end;
    inc(l);
  end;
  closefile(f1);
  closefile(f2);
  closefile(diff);
end;

1 Ответ

1 голос
/ 22 апреля 2020

У вашего function compstr(s1, s2: string): boolean; есть несколько проблем:

  1. Переменная btemp: boolean не нужна. При необходимости вы можете установить result напрямую.

  2. Если длина двух строк одинакова, но содержимое отличается (if (s1[i] <> s2[i])), вы вызываете exit, который переходит на end; функции и result никогда не присваивается значение btemp. Таким образом, строки одинаковой длины, но разного содержимого возвращают значение True, которое вы установили в начале. Возможно, вы думали о break, который выйдет из for l oop и попадет на линию result := btemp;, что затем даст правильное значение.

  3. Весь функция - пустая трата времени, вы называете ее в compfile() с помощью:

   ...
   if compstr(buf1, buf2) then
   ....

, который можно заменить прямым сравнением:

   ....
   if buf1 = buf2 then
   ....

PS Ваша заявка то, что SameStr() не работает, ложно. Вы, вероятно, не правильно его использовали.

...