0

我正在尝试使此代码正常工作。这是一个标准的搜索和替换功能。

由于某种原因,我根本没有收到任何错误,但文本文件中没有任何变化。

这是完整的代码:

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;
4

1 回答 1

7

原因是S,searchstringreplacestring是 Unicode 字符串(例如,“Test” 是54 00 65 00 73 00 74 00),而文本文件可能是 UTF-8 或 ANSI 文件(例如,“Test” 是54 65 73 74)。

这意味着存储在其中的值S将被高度损坏(您获取 UTF-8 文本的字节并将它们解释为 Unicode 文本的字节)!在Test示例中,您将得到敔瑳??最后两个字符是随机的(为什么?)。

要检验这个假设,只需声明SAnsiString,那么它应该可以工作。

当然,如果你需要 Unicode 支持,你需要做一些 UTF-8 编码/解码。解决您的问题的最简单方法是使用TStringList; 然后您就可以免费获得所需的一切。

于 2013-04-21T19:46:23.393 回答