将带有空字符的字符串保存到文件中

Cas*_*ady 1 delphi delphi-7

我有一个包含空字符的字符串.

我试图用这段代码将它保存到一个文件:

myStringList.Text := myString;
myStringList.SaveToFile('c:\myfile');
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果源字符串在开头有一个空字符,则myStringList.Text为空.

我以为只有C字符串被空字符终止,Delphi总是很好用.

如何将字符串的内容保存到文件?

Ken*_*ite 6

我认为你的意思是"保存一个包含#0字符的字符串".

如果是这种情况,请不要尝试将其放入TStringList.实际上,不要试图将它保存为字符串; 就像在C中一样,NULL字符(#0在Delphi中)会导致字符串有时被截断.使用a TFileStream并将其直接写为字节内容:

var
  FS: TFileStream;
begin
  FS := TFileStream.Create('C:\MyFile', fmCreate);
  try
    FS.Write(myString[1], Length(myString) * SizeOf(Char));
  finally
    FS.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

读回来:

var
  FS: TFileStream;
begin
  FS := TFileStream.Create('C:\MyFile', fmOpenRead);
  try
    SetLength(MyString, FS.Size);
    FS.Read(MyString[1], FS.Size);
  finally
    FS.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 我刚测试过,包含文本`#0#0'Something'#0`的`TStringList`已成功保存到TXT文件(生成的文件有14个字节).然而,你的答案是"最佳实践",如果它不是"字符串",则不应该使用`string`,所以+1; OP现在可能在`delphi-7`上,但任何将`string`视为除字符串之外的任何代码在转换为Unicode时都会失败. (2认同)

Dav*_*nan 5

设置对象的Text属性时TStrings,新值将被解析为以null结尾的字符串.因此,当代码到达您的空字符时,解析将停止.

我不确定为什么Delphi RTL代码是这样设计的,而且没有记录,但这就是设置Text属性的工作方式.

您可以通过使用Add方法而不是Text属性来避免这种情况.

myStringList.Clear;
myStringList.Add(myString);
myStringList.SaveToFile(FileName);
Run Code Online (Sandbox Code Playgroud)