加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi 2010中写一个字符串到TFileStream

发布时间:2020-12-15 06:09:47 所属栏目:大数据 来源:网络整理
导读:我有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;
我有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');
....

这在Delphi 2007中有效,但在Delphi 2010中给了我很多垃圾字符.我知道这是由于unicode合规性问题,但我不知道如何解决这个问题.

这是我迄今为止所尝试的:

>更改数据类型
SourceBuffer(也是参数
预期由WideString)到PWideChar
>每个suggestions listed
here

我究竟做错了什么?

解决方法

您不需要单独的缓冲区来将字符串写入流.可能最简单的方法是将字符串编码为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;

我已经将TStreamEx声明为TStream的类帮助器,但是将其重写为一个独立的过程和函数,就像你的例子不是太难了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读