zoukankan      html  css  js  c++  java
  • c++ 读写复合文件简单例子

    创建个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};	// 必须指定初始值,否则会显示出乱码,也可以设为 ''
    	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);
    }
    
  • 相关阅读:
    07.消除过期对象的引用
    1.1进程和多线程概述
    1.2什么是操作系统
    06.避免创建不必要的对象
    05.依赖注入优先于硬连接资源
    04.使用私有构造器执行非实例化
    03.使用私有构造方法或枚类实现 Singleton 属性
    02.当构造参数过多时使用builder模式
    01.考虑使用静态工厂方法替代构造方法
    iiS申请地址
  • 原文地址:https://www.cnblogs.com/x-ing/p/3468364.html
Copyright © 2011-2022 走看看