我是靠谱客的博主 风中蜻蜓,最近开发中收集的这篇文章主要介绍VC++ 操作ini库 VS2010,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

源码地址:http://download.csdn.net/detail/qq575787460/4768396

头文件

#ifndef MYINI_H
#define MYINI_H

#include <string>
#include <vector>
#include <map>
using namespace std;
class MyIni
{
public:
	MyIni(void);
	MyIni(char *_iniFilePath);
	~MyIni(void);

	//获取所有的section名
	void getAllSections(vector<string>& vecSections);
	//通过section名,该section下所有的key-value
	void getKeyValueBySection(const char* sectionName,map<string,string>& kv);
	
	//判断是否存在指定的section
	bool isSectionExists(const char* sectionName);
	//判断是否存在指定的key
	bool isKeyExists(const char*sectionName,const char*keyName);

	//获取section下某个key的值
	string getValueString(const char*sectionName,const char*keyName);
	//获取section下某个key的值,如果该section或key不存在,返回false
	bool getValueInt(const char*sectionName,const char*keyName,int &result);

	//写入字符值
	void writeKeyValue(const char*sectionName,const char*keyName,const char*value);

	//删除section
	void deleteSection(const char* sectionName);
	//删除section中的某个键
	void deleteKey(const char* sectionName,const char* keyName);

	//获取section的个数
	int getSectionCount();
	//获取该section下key-value的个数
	int getKeyValueCount(const char* sectionName);

private:
	//保存ini文件的绝对路径
	char iniFilePath[260];
	//申请缓冲区的默认长度
	static int _bufLen;
	//private 供getValueString和getKeyValueBySection调用
	void myGetPrivateProfileString(const char*sectionName,const char*keyName,char **buf,int bufLen);
	//private //private 供getSectionCount和getAllSections调用
	void myGetPrivateProfileSectionNames(char** buf,int bufLen);
};

#else
#endif


实现文件

#include "MyIni.h"
#include <string>
#include <windows.h>
#include <utility>
using namespace std;

int MyIni::_bufLen=1024;

MyIni::MyIni(void)
{
}

MyIni::MyIni(char*_iniFilePath)
{
	strcpy_s(iniFilePath,_iniFilePath);
}

MyIni::~MyIni(void)
{
}

//获取所有的section名
void MyIni::getAllSections(vector<string>& vecSections)
{
	vecSections.clear();

	char *buf=new char[_bufLen];
	myGetPrivateProfileSectionNames(&buf,_bufLen);

	/*
	**通过string来取出每个section的依据
	**GetPrivateProfileSectionNames取出的sections以间隔,存于buf中
	**string遇见就终止
	*/
	char*p=buf;
	string strName=p;
	while(strName.length()!=0)
	{
		vecSections.push_back(strName);
		p+=strName.length()+1;
		strName=p;
	}

	delete []buf;
}

//通过section名,该section下所有的key-value
void MyIni::getKeyValueBySection(const char* sectionName,map<string,string>& kv)
{
	char *buf=new char[_bufLen];
	myGetPrivateProfileString(sectionName,NULL,&buf,_bufLen);

	kv.clear();
	char *p=buf;
	string strKey=p;
	while(strKey.length()!=0)
	{
		kv.insert(make_pair(strKey,getValueString(sectionName,strKey.c_str())));
		p+=strKey.length()+1;
		strKey=p;
	}
	delete []buf;
}

//判断是否存在指定的section
bool MyIni::isSectionExists(const char* sectionName)
{
	vector<string> vec;
	getAllSections(vec);
	
	string strSec=sectionName;
	int count=vec.size();
	for(int i=0;i<count;i++)
	{
		if(vec[i]==strSec)
		{
			return true;
		}
	}

	return false;
}
//判断是否存在指定的key
bool MyIni::isKeyExists(const char*sectionName,const char*keyName)
{
	bool isExists=false;
	//不必判断section是否存在
	char *buf=new char[_bufLen];
	myGetPrivateProfileString(sectionName,NULL,&buf,_bufLen);

	char *p=buf;
	string strKey=p;
	string strKeyTemp=keyName;
	while(strKey.length()!=0)
	{
		if(strKey==strKeyTemp)
		{
			isExists=true;
			break;
		}
		p+=strKey.length()+1;
		strKey=p;
	}
	delete []buf;

	return isExists;
}

//private 供getValueString和getKeyValueBySection调用
void MyIni::myGetPrivateProfileString(const char*sectionName,const char*keyName,char **buf,int bufLen)
{
	DWORD dwRes=GetPrivateProfileString(sectionName,keyName,NULL,*buf,bufLen,iniFilePath);
	while(dwRes==bufLen-2)
	{
		delete [](*buf);
		bufLen+=1024;
		*buf=new char[bufLen];
		dwRes=GetPrivateProfileString(sectionName,keyName,NULL,*buf,bufLen,iniFilePath);
	}
}

//private 供getSectionCount和getAllSections调用
void MyIni::myGetPrivateProfileSectionNames(char** buf,int bufLen)
{
	DWORD dwRes=GetPrivateProfileSectionNames(*buf,bufLen,iniFilePath);
	//缓冲区过小,重新设置缓冲区
	while(dwRes==bufLen-2)
	{
		delete []buf;
		bufLen+=1024;
		*buf=new char[bufLen];
		dwRes=GetPrivateProfileSectionNames(*buf,bufLen,iniFilePath);
	}
}
//获取section的个数
int MyIni::getSectionCount()
{
	char *buf=new char[_bufLen];
	myGetPrivateProfileSectionNames(&buf,_bufLen);

	int count=0;
	char *p=buf;
	string str=p;
	while(str.length()!=0)
	{
		count++;
		p+=str.length()+1;
		str=p;
	}
	delete []buf;
	return count;
}
//获取该section下key-value的个数
int MyIni::getKeyValueCount(const char* sectionName)
{
	char *buf=new char[_bufLen];
	myGetPrivateProfileString(sectionName,NULL,&buf,_bufLen);

	int count=0;
	char *p=buf;
	string strKey=p;
	while(strKey.length()!=0)
	{
		count++;
		p+=strKey.length()+1;
		strKey=p;
	}
	delete []buf;
	return count;
}

//写入字符值
void MyIni::writeKeyValue(const char*sectionName,const char*keyName,const char*value)
{
	::WritePrivateProfileString(sectionName,keyName,value,iniFilePath);
}

//删除section
void MyIni::deleteSection(const char* sectionName)
{
	::WritePrivateProfileString(sectionName,NULL,NULL,iniFilePath);
}
//删除section中的某个键
void MyIni::deleteKey(const char* sectionName,const char* keyName)
{
	::WritePrivateProfileString(sectionName,keyName,NULL,iniFilePath);
}

//获取section下某个key的值,必须确保key存在
string MyIni::getValueString(const char*sectionName,const char*keyName)
{
	char *buf=new char[_bufLen];
	myGetPrivateProfileString(sectionName,keyName,&buf,_bufLen);
	string str=buf;
	delete []buf;
	return str;
}

//获取section下某个key的值,如果该section或key不存在,返回false
bool MyIni::getValueInt(const char*sectionName,const char*keyName,int& result)
{
	if(this->isKeyExists(sectionName,keyName))
	{
		result=GetPrivateProfileInt(sectionName,keyName,-1,iniFilePath);
		return true;
	}
	else
		return false;
}


 

最后

以上就是风中蜻蜓为你收集整理的VC++ 操作ini库 VS2010的全部内容,希望文章能够帮你解决VC++ 操作ini库 VS2010所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部