如何检查两个文本文件中哪些行相等?

How check what lines are equal in two text files?

这个简单的代码可以很好地检查行是否不同,当我尝试检查是否等于 none 当两个文件在同一行索引中具有相同的字符串时,找到了元素。这里缺少什么?

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;

您的 function compstr(s1, s2: string): boolean; 有几个问题:

  1. btemp: boolean 变量是不必要的。可以根据需要直接设置result

  2. 如果两行长度相等,但内容不同(if (s1[i] <> s2[i]))则调用exit,跳转到函数的end; result 永远不会被赋予 btemp 的值。因此,长度相等但内容不同的字符串将返回您在开始时设置的值 True。也许您正在考虑 break,它会退出 for 循环并到达 result := btemp; 行,然后会产生正确的值。

  3. 整个函数都是浪费,你在compfile()中调用它:

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

可以用直接比较代替:

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

P.S。您声称 SameStr() 不起作用是错误的。你可能没有正确使用它。