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

delphi – 将字符串写入TMemoryStream

发布时间:2020-12-15 04:09:47 所属栏目:大数据 来源:网络整理
导读:我在这里已经阅读了很多关于将字符串写入TMemoryStream并保存到文件并将字符串读回TMemoryStream的讨论 我不知道我在这里做错了什么,但我的SaveData或我的LoadData都是错误的.我可以在调用SaveData之前检查Title的值,它符合我的预期.但是,当我调用LoadData并
我在这里已经阅读了很多关于将字符串写入TMemoryStream并保存到文件并将字符串读回TMemoryStream的讨论

我不知道我在这里做错了什么,但我的SaveData或我的LoadData都是错误的.我可以在调用SaveData之前检查Title的值,它符合我的预期.但是,当我调用LoadData并检查Title的值时,它是垃圾.任何人都可以告诉我,我做错了

procedure SaveData(FileName: TFileName);
var
 MemStr: TMemoryStream;
 Title: String;
begin
 MemStr:= TMemoryStream.Create;
try
 MemStr.Seek(0,soFromBeginning);
 WriteStreamStr( MemStr,TItle );
 MemStr.SaveToFile(FileName);
finally
 MemStr.Free;
end;
end;

procedure LoadData(FileName: TFileName);
var
 MemStr: TMemoryStream;
 Title: String;
begin
 MemStr:= TMemoryStream.Create;
 try
  MemStr.LoadFromFile(FileName);
  MemStr.Seek(0,soFromBeginning);
  Title := ReadStreamStr( MemStr );
 finally
   MemStr.Free;
  end;
end;



procedure WriteStreamInt(Stream : TStream; Num : integer);
 {writes an integer to the stream}
begin
 Stream.WriteBuffer(Num,SizeOf(Integer));
end;

procedure WriteStreamStr(Stream : TStream; Str : string);
 {writes a string to the stream}
var
 StrLen : integer;
begin
 {get length of string}
 StrLen := Length(Str);
 {write length of string}
 WriteStreamInt(Stream,StrLen);
 if StrLen > 0 then
 {write characters}
 Stream.Write(Str[1],StrLen);
end;


function ReadStreamInt(Stream : TStream) : integer;
 {returns an integer from stream}
begin
 Stream.ReadBuffer(Result,SizeOf(Integer));
end;

function ReadStreamStr(Stream : TStream) : string;
 {returns a string from the stream}
var
 LenStr : integer;
begin
 Result := '';
 {get length of string}
 LenStr := ReadStreamInt(Stream);
 {set string to get memory}
 SetLength(Result,LenStr);
 {read characters}
 Stream.Read(Result[1],LenStr);
end;

解决方法

当你使用
Stream.Write(Str[1],StrLen);

您正在将第一个StrLen字节写入流中.但是(unicode)字符串数据实际上是StrLen * SizeOf(Char)字节(您必须考虑char类型的大小).以下应该工作:

Stream.Write(Str[1],StrLen * SizeOf(Str[1]));

从流中读取数据时相同.

(编辑:李大同)

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

    推荐文章
      热点阅读