如何检查两个文本文件中哪些行相等?
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;
有几个问题:
btemp: boolean
变量是不必要的。可以根据需要直接设置result
如果两行长度相等,但内容不同(if (s1[i] <> s2[i])
)则调用exit
,跳转到函数的end;
result
永远不会被赋予 btemp
的值。因此,长度相等但内容不同的字符串将返回您在开始时设置的值 True
。也许您正在考虑 break
,它会退出 for
循环并到达 result := btemp;
行,然后会产生正确的值。
整个函数都是浪费,你在compfile()
中调用它:
...
if compstr(buf1, buf2) then
....
可以用直接比较代替:
....
if buf1 = buf2 then
....
P.S。您声称 SameStr()
不起作用是错误的。你可能没有正确使用它。
这个简单的代码可以很好地检查行是否不同,当我尝试检查是否等于 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;
有几个问题:
btemp: boolean
变量是不必要的。可以根据需要直接设置result
如果两行长度相等,但内容不同(
if (s1[i] <> s2[i])
)则调用exit
,跳转到函数的end;
result
永远不会被赋予btemp
的值。因此,长度相等但内容不同的字符串将返回您在开始时设置的值True
。也许您正在考虑break
,它会退出for
循环并到达result := btemp;
行,然后会产生正确的值。整个函数都是浪费,你在
compfile()
中调用它:
...
if compstr(buf1, buf2) then
....
可以用直接比较代替:
....
if buf1 = buf2 then
....
P.S。您声称 SameStr()
不起作用是错误的。你可能没有正确使用它。