当前位置:  开发笔记 > 程序员 > 正文

在Delphi 2010中将字符串写入TFileStream

如何解决《在Delphi2010中将字符串写入TFileStream》经验,为你挑选了2个好方法。

我有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

这里列出的每一条建议都是如此

我究竟做错了什么?



1> Mason Wheele..:

您不需要单独的缓冲区来将字符串写入流.可能最简单的方法是将字符串编码为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的类助手,但是将它们重写为独奏程序和函数就不应该太难了.


那些"乱码"是字符串的长度,所以读取函数知道要读回多少.如果你需要这个是纯文本,你需要一些其他的方法告诉readString在哪里停止.
在这种情况下,请确保其他应用程序知道它正在接收UTF8格式的字符串.或者,如果您无法控制其他应用程序,请将其转换为AnsiString而不是UTF8String.但是,如果您使用ANSI集之外的Unicode字符,则可能会丢失数据.
在删除“ self.WriteBuffer(len,4);”之后,这对我有用。-正在向输出文件中写入一些乱码。

2> John Kaster..:

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


链接坏了.看起来像这样:http://docwiki.embarcadero.com/CodeExamples/en/StreamStrRdWr_%28Delphi%29
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有