用BCB操作TMemoryStream流文件

pkrlfj 2011-05-31 05:19:56
我有一个流文件,现在在它最前面加入指定的几个字符,如:
AnsiString str;
str="pkr";
TBlobField *blob =(TBlobField *)DataModule1->ADOQuery1->FieldByName("infotext");
TMemoryStream *p=new TMemoryStream();
void *Buffer;
blob->SaveToStream(p);
p->Position=0;
p->Write(Buffer,str.Length());
p->SaveToFile(SaveDialog1->FileName);
这样就可以加入"pkr"这几个字符到流文件中了

但是我读出来的时候就要去掉"pkr"这几个字符了,才能还原infotext字段的值
void *Buffer;
TMemoryStream *p1=new TMemoryStream();//源
p1->LoadFromFile(str);str就是那个加了字符"pkr"的流文件
p1->Position=?;指针移到哪个位置
/* p2->Seek(0,soFromBeginning);
p1->Seek(0,soFromEnd);
p1->CopyFrom(p2,p2->Size);
p2->LoadFromStream(p1);*/
Memo1->LoadFromStream(p1);
求帮忙?????????????
...全文
507 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigfog 2011-06-01
  • 打赏
  • 举报
回复
除妖哥指出的问题外,还有问题
void *Buffer;
blob->SaveToStream(p);
p->Position=0;
p->Write(Buffer,str.Length());
//上句错误 Buffer是野指针,改为p->Write(str.c_str(),str.Length());
//你这样做只是将内存流的前几个字节改成str,这样就不能还原成原来的
//按你的要求建议在最后追加str,取出来时只需将长度设置一下就是原来的流了
p->Position=0; //保存前加上这句,要复位
p->SaveToFile(SaveDialog1->FileName);
ccrun.com 2011-06-01
  • 打赏
  • 举报
回复
你能保证str这个文件里保存的数据是正确的吗?

p->Write(Buffer,str.Length());
p->SaveToFile(SaveDialog1->FileName);

这两行代码,当Write执行以后,p的Position已经发生了变化,保存到文件以前,应该再将其归零。
pkrlfj 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ccrun 的回复:]
p1->Position = 3就行了。不需要再seek
[/Quote]
妖哥,定位到3,不行呢?再帮我仔细看看?
ccrun.com 2011-05-31
  • 打赏
  • 举报
回复
p1->Position = 3就行了。不需要再seek

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧