C++读写复合文档的一点补充

上次发表了一篇文章,因为太过于匆忙了,所以写得不是很好,也不全面,请大家见谅。关于读复合文档,查了相关资料,,如果不知道数据长度,也是可以读出来的。用到的是一个 STATSTG 的类型,也非常简单,下面给出主要代码。

写复合文档 IStream *pStream; IStorage *pStgRoot,*pStgSub; CString strText("Hello World!\nHow are you?"); DWORD dwMode=STGM_CREATE|STGM_WRITE|STGM_SHARE_EXCLUSIVE; StgCreateDocfile(FILENAME,dwMode,0,&pStgRoot); // 创建一个复合文档,然后交由 pStgRoot 进行读写 pStgRoot->CreateStorage(L"StgRoot",dwMode,0,0,&pStgSub); // 创建一个子 IStorage ,交由 pStgSub 进行读写 pStgSub->CreateStream(L"Stream",dwMode,0,0,&pStream); // 创建一个子 IStream ,交由 pStream 进行读写 pStream->Write((LPTSTR)(LPCTSTR)strText,strText.GetLength(),NULL); // 写入数据 // 必需释放资源,否则写入不完全 pStream->Release(); pStgSub->Release(); pStgRoot->Release(); 

读复合文档 IStorage *pStgRoot,*pStgSub; IStream *pStream; STATSTG statstg; // 包含有关打开的存储、流或字节数组对象的统计信息 CString strText; // 用于存放读入的数据 long nLen=0; // 要读入的数据长度 DWORD dwMode=STGM_READ|STGM_SHARE_EXCLUSIVE; StgOpenStorage(FILENAME,NULL,dwMode,NULL,0,&pStgRoot); // 打开一个复合文档,交由 pStgRoot 进行读 pStgRoot->OpenStorage(L"StgRoot",NULL,dwMode,NULL,0,&pStgSub); // 打开一个子存储,交由 pStgSub 进行读 pStgSub->OpenStream(L"Stream",NULL,dwMode,0,&pStream); // 打开一个子数据流,交由 pStream 进行读 pStream->Stat(&statstg,STATFLAG_NONAME); // 获得数据流的相关信息 nLen=statstg.cbSize.QuadPart; // 获得数据流长度 pStream->Read(strText.GetBuffer(nLen),nLen,NULL); // 读入数据 // 释放资源 strText.ReleaseBuffer(); // 释放 strText 的缓冲区 pStream->Release(); pStgSub->Release(); pStgRoot->Release(); AfxMessageBox(strText); 

因为较简单,而且之前一篇文章讲过了,在此就不详细说明了。以上代码在VC6.0 中编译通过

转载于:https://www.cnblogs.com/zimmerk/archive/2010/07/24/1948974.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值