流高手请进,送分100!!!(100分)

  • 主题发起人 主题发起人 pengd
  • 开始时间 开始时间
P

pengd

Unregistered / Unconfirmed
GUEST, unregistred user!
自己定义的记录类型:
type
Tstudent=record
id:string;
name:string;
age:integer;
end;
利用Tmemorystream写入文件,文件的类型.dat:改操作成功
procedure TForm1.Button1Click(Sender: TObject);
VAR
Target:Tmemorystream;
student:Tstudent;
begin
with student do
begin
id:='100001';
name:='李小强';
age:=20;
end;
try
target:=tmemorystream.create;
target.Write(student,sizeof(student));
target.savetofile('c:/student.dat');
finally
target.free;
end;
end;
利用Tstringlist保存到另一个.dat文件:
procedure TForm1.Button2Click(Sender: TObject);
var
fstream:Tfilestream;
sl:Tstringlist;
begin
fstream:=Tfilestream.Create('c:/student.dat',fmopenread);
fstream.Position:=0;
sl:=Tstringlist.Create;
sl.LoadFromStream(fstream);
sl.SavetoFile('c:/temp.dat');
fstream.free;
sl.free;
end;
当打开temp.dat文件时,只是保存了原文件的一些,不能完全保存:当遇到student.dat
文件的不可见字符后面的内容就没有保存了,请问高手是什么原因?怎么解决?Thanks!!!
 
Wrong:sizeof(student))=SizeOf(Pointer)+SizeOf(Pointer)+SizeOf(integer)
Right:the Size of student=Length(student.id)+Length(student.name)+Lenght(integer)
您保存的时候要保存每一个Student的大小及它的ID长度、姓名长度。
然后根据Student的长度来读取一个Student值,然后根据ID的长度读取ID的值,根据
name的长度读取name的值,读取age的值我就不说了。

问题出在String的长度是变化的。

 
该结构数据无法一次读出或写入, 因为该结构中的id和name都是变长字符串, 在结构中保存的只是一个地址, 具体内容保存在其他地方。
如果只写入record结构的话, id和name写入的只是一个无用的地址值, 具体内容均丢失。
 
后退
顶部