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以\0间隔,存于buf中
	**string遇见\0就终止
	*/
	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;
}


 

纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值