您的位置:首页 > 编程语言 > C语言/C++

c++ 读写复合文件简单例子

2013-12-10 22:40 531 查看
创建个MFC的简单功能来调用以下接口

void testWrite()
{
// TODO: Add your control notification handler code here
const unsigned short *FILENAME = L"c:\\test.stg";
DWORD dwMode=STGM_WRITE|STGM_CREATE|STGM_SHARE_EXCLUSIVE;	// 只写|如果文件存在则替换,不存在则创建|独占
IStorage *pStgRoot,*pStgSub;
IStream *pStream;
pStgRoot=NULL;	// 设为NULL,可以知道函数是否执行成功
////////////////////////////////////////////////////////////////////////////////
// 创建复合文档
// 如果文件不存在则创建一个新文件,已经存在则替换原文件
// 创建完成后得到一个新的storage对象,可用于创建一个根目录
StgCreateDocfile(
FILENAME,	// 复合文档路径
dwMode,	// 请问模式
0,	// 必须为0
&pStgRoot	// 返回一个新的storage对象
);
////////////////////////////////////////////////////////////////////////////////
// 创建一个根目录,并准备创建一个子目录
pStgRoot->CreateStorage(
L"StgRoot",	// 子IStorage的名称
dwMode,	// 请问模式
0,	// 必须为0
0,	// 必须为0
&pStgSub	// 返回一个新的storage对象
);
////////////////////////////////////////////////////////////////////////////////
// 创建一个数据流(结点),并准备写入数据
pStgSub->CreateStream(
L"Stm",	// 子IStream的名称
dwMode,	// 请问模式
0,	// 必须为0
0,	// 必须为0
&pStream	// 返回一个新的IStream接口指针
);
////////////////////////////////////////////////////////////////////////////////
// 写入数据
char strText[]={"Hello World2!"};
ULONG actWrite;
int nLen=strlen(strText);	// 字串长度
pStream->Write(
strText,	// 要写入的数据
nLen,	// 要写入数据的长度
&actWrite	// 实际写入长度,也可以设为NULL
);
////////////////////////////////////////////////////////////////////////////////
// 释放资源
// 如果不调用Release()方法,会导致写入不完全、文档体积大、无法正常读取等问题
pStream->Release();
pStgSub->Release();
pStgRoot->Release();
////////////////////////////////////////////////////////////////////////////////
CString strMsg;
strMsg.Format("数据长度:%d , 实际写入长度:%ld",nLen,actWrite);
AfxMessageBox(strMsg);
cout<<strMsg.GetBuffer(100)<<endl;
}

void testRead()
{
DWORD dwMode=STGM_READ|STGM_SHARE_EXCLUSIVE;	// 只读|独占
const unsigned short *FILENAME = L"c:\\test.stg";
IStorage *pStgRoot,*pStgSub;
IStream *pStream;
pStgRoot=NULL;
pStgSub=NULL;
pStream=NULL;
////////////////////////////////////////////////////////////////////////////////
// 打开文件
StgOpenStorage(
FILENAME,
NULL,
dwMode,
NULL,
0,
&pStgRoot
);
////////////////////////////////////////////////////////////////////////////////
// 打开一个目录
pStgRoot->OpenStorage(
L"StgRoot",	// 注意大小写
NULL,
dwMode,
NULL,
0,
&pStgSub
);
////////////////////////////////////////////////////////////////////////////////
// 准备读取数据
pStgSub->OpenStream(
L"Stm",
NULL,
dwMode,
0,
&pStream
);
////////////////////////////////////////////////////////////////////////////////
// 读取数据
const int nLen=255;	// 准备读入的长度
char strText[nLen]={0};	// 必须指定初始值,否则会显示出乱码,也可以设为 '\0'
ULONG actRead;
pStream->Read(
strText,	// 存放放入的数据的缓冲区
nLen,	// 要读入数据的长度,如不清楚可以设为较大的数
&actRead	// 实际读入的长度
);
////////////////////////////////////////////////////////////////////////////////
// 释放资源
pStream->Release();
pStgSub->Release();
pStgRoot->Release();
////////////////////////////////////////////////////////////////////////////////
AfxMessageBox(strText);
CString strMsg;
strMsg.Format("指定读入数据的长度:%d , 实际读入数据长度:%ld",nLen,actRead);
AfxMessageBox(strMsg);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: