关于Record写入流后再读出的问题?(100分)

  • 主题发起人 主题发起人 易名烦
  • 开始时间 开始时间

易名烦

Unregistered / Unconfirmed
GUEST, unregistred user!
for i := 0 to mHis.Enumerate - 1 do
begin
mHisRec := mHis.Items;
mRec.Title := mHisRec.Title;
mRec.Url := mHisRec.Url;
mRec.SaveTime := mHisRec.Lastvisited;
mStream.Write(mRec, SizeOf(mRec));
end;
mHis.ClearList;
ss := TStringList.Create;
// mStream.Position := SizeOf(CMD_SAVe);
mStream.Position := 0;
while mStream.Position < mStream.Size do //这个循环几次后报地址错
begin
i := SizeOf(mRec);
mStream.Read(mRec, SizeOf(mRec))
//这里报错
ss.Add(mRec.Title + '&amp;*&amp;' + mRec.Url);
end;
ss.SaveToFile('d:/aa.txt');
 
while mStream.Position [red]<=[/red] mStream.Size do
 
while mStream.Position < mStream.Size - 1 do
 
楼上两位,好象不是越界的问题.
 
你定义的Record里面有String类型吧
 
对,是widestring,我也想可能是这个问题.
喝高师兄请指教.

TUrlRec = record
Title: WideString;
Url: WideString;
SaveTime: TDateTime;
end;
 
这样的记录不能够用你的方法来写入文件, 如果要把这条记录保存下来, 只能一个
域一个域写入, 你可以这样写
1 写入Length(Title), 占用SizeOf(Integer)字节
2 写入Title的内容, 占用Length(Title)字节
3 写入Length(Url), 占用SizeOf(Integer)字节
4 写入Url的内容, 占用Length(Url)字节
5 写入SaveTime, 占用SizeOf(TDateTime)字节

读取的时候, 也是这样先读长度, 再读内容
1 读取SizeOf(Integer)字节, 作为Title的长度值
2 根据读入的数值用SetLength给Title分配空间
3 读取Title内容
......
 
喝高:
我现在已经可写string,但widestring还是有问题.
 
WideChar 是一个Word, 所以你用Length获取的WideString的长度应该乘2才是
Byte的长度胡
 
问题出在sizeof(TUrlRec)上,把你的结构改一下就可以了。
TUrlRec = record
Title: String[40]
//加上长度限制,取最大值。
Url: String[60];//同上。
SaveTime: TDateTime;//是DOUBLE类型,8个字节。
end;

 
接受答案了.
 

Similar threads

I
回复
0
查看
563
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部