代码之家  ›  专栏  ›  技术社区  ›  JosephStyons

在Delphi 2010中将字符串写入TFileStream

  •  13
  • JosephStyons  · 技术社区  · 16 年前

    我的Delphi 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');
    ....
    

    这在Delphi2007中有效,但在Delphi2010中它给了我很多垃圾字符。我知道这是由于unicode法规遵从性问题造成的,但我不确定如何解决这个问题。

    以下是我到目前为止所做的尝试:

    我做错了什么?

    2 回复  |  直到 8 年前
        1
  •  18
  •   Mason Wheeler    16 年前

    将字符串写入流不需要单独的缓冲区。可能最简单的方法是将字符串编码为UTF8,如下所示:

    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;
    

        2
  •  15
  •   Tony    11 年前

    Delphi 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();