我想让这段代码正常运行。它是标准的搜索和替换功能。
我没有任何错误,但由于某种原因,文本文件中没有任何变化。
以下是完整代码:
procedure FileReplaceString(const FileName, searchstring, replacestring: string);
var
fs: TFileStream;
S: string;
begin
fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
try
SetLength(S, fs.Size);
fs.ReadBuffer(S[1], fs.Size);
finally
fs.Free;
end;
S := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]);
fs := TFileStream.Create(FileName, fmCreate);
try
fs.WriteBuffer(S[1], Length(S));
finally
fs.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var Path, FullPath:string;
begin
Path:= ExtractFilePath(Application.ExeName);
FullPath:= Path + 'test.txt';
FileReplaceString(FullPath,'changethis','withthis');
end;
答案 0 :(得分:7)
原因是S
,searchstring
和replacestring
是Unicode字符串(例如,“Test”是54 00 65 00 73 00 74 00
),而文本文件可能是UTF-8或ANSI文件(例如,“Test”为54 65 73 74
)。
这意味着S
中存储的值将严重损坏(您获取UTF-8文本的字节并将其解释为Unicode文本的字节)!在Test
示例中,您将获得敔瑳??
,其中最后两个字符是随机的(为什么?)。
要测试这个假设,只需将S
声明为AnsiString
,然后就可以了。
当然,如果您需要Unicode支持,则需要进行一些UTF-8编码/解码。解决问题的最简单方法是使用TStringList
;那么你就可以免费获得所需的一切。