德尔福2010年写一个字符串到TFileStream的(Writing a string to a

2019-08-06 23:07发布

我2007年德尔福代码如下所示:

procedure WriteString(Stream: TFileStream; var SourceBuffer: PChar; s: string);
begin
  StrPCopy(SourceBuffer,s);
  Stream.Write(SourceBuffer[0], StrLen(SourceBuffer));
end;

我这样称呼它:

var
  SourceBuffer : PChar;
  MyFile: TFileStream;

....

SourceBuffer := StrAlloc(1024);
MyFile := TFileStream.Create('MyFile.txt',fmCreate);
WriteString(MyFile,SourceBuffer,'Some Text');
....

这曾在德尔福2007年,但它给了我很多在2010年德尔福垃圾字符我知道这是由于unicode的合规性问题,但我不知道如何解决这个问题。

以下是我试过到目前为止:

  • 改变SourceBuffer到PWideChar数据类型(以及参数由WideString的预期)

  • 的每一个在这里列出的建议

我究竟做错了什么?

Answer 1:

你并不需要一个单独的缓冲区写一个字符串到流。 也许做最简单的方法是将字符串编码成UTF-8,如下所示:

procedure TStreamEx.writeString(const data: string);
var
   len: cardinal;
   oString: UTF8String;
begin
   oString := UTF8String(data);
   len := length(oString);
   self.WriteBuffer(len, 4);
   if len > 0 then
      self.WriteBuffer(oString[1], len);
end;

function TStreamEx.readString: string;
var
   len: integer;
   iString: UTF8String;
begin
   self.readBuffer(len, 4);
   if len > 0 then
   begin
      setLength(iString, len);
      self.ReadBuffer(iString[1], len);
      result := string(iString);
   end;
end;

我已经声明TStreamEx作为一个阶级的帮手T流,但它不应该太困难重写这些作为一个单独的程序和功能,喜欢你的例子。



Answer 2:

德尔福2010有这个很好的解决方案,记录在这里:

http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29

var
  Writer: TStreamWriter;
...

  { Create a new stream writer directly. }
  Writer := TStreamWriter.Create('MyFile.txt', false, TEncoding.UTF8);
  Writer.Write('Some Text');

  { Close and free the writer. }
  Writer.Free();


文章来源: Writing a string to a TFileStream in Delphi 2010