C/C++ INI文件操作实现代码
一、INI文件用途:
1、存储程序的初始化信息;
2、存储需要保存的数据信息。
二、INI文件结构:
由节名、键名、键值组成。形式如下:
[节名]
键名=键值
备注:一个INI文件,可以用多个节。
三、读取INI文件
1、WritePrivateProfileString
该函数用于向INI文件中写入一个字符串数据。
函数原型如下:
BOOLWritePrivateProfileString( LPCTSTRlpAppName,//pointertosectionname LPCTSTRlpKeyName,//pointertokeyname LPCTSTRlpString,//pointertostringtoadd LPCTSTRlpFileName//pointertoinitializationfilename );
参数说明:
lpAppName:指定节名,以空终止结尾的字符串。如果INI文件中节名不存在,将创建一个节名。
lpKeyName:键名,以空终止结尾的字符串。如果INI文件中该键名不存在,将创建一个键名。如果该参数为NULL,包括节及节下的所有项目都将被删除。
lpString:写到键值中的数据,以空终止结尾的字符串。
lpFileName:INI文件的名称,以空终止结尾的字符串。指定需要写入数据的INI文件,如果指定的INI文件不存在将创建。
返回值:
如果函数成功将字符串复制到初始化文件,返回值是非零。
如果函数失败,刷新缓存版本的最近访问初始化文件,返回值是零。
2、GetPrivateProfileString
该函数用于获取INI文件中的键值。
函数原型如下:
DWORDGetPrivateProfileString( LPCTSTRlpAppName,//pointstosectionname LPCTSTRlpKeyName,//pointstokeyname LPCTSTRlpDefault,//pointstodefaultstring LPTSTRlpReturnedString,//pointstodestinationbuffer DWORDnSize,//sizeofdestinationbuffer LPCTSTRlpFileName//pointstoinitializationfilename );
参数说明:
lpAppName:指定节名,以空终止结尾的字符串。如果该参数为NULL,函数将复制所有的节名到所指定的缓冲区中。
lpKeyName:键名,以空终止结尾的字符串。如果该参数为NULL,函数将lpAppName节下所有的键名复制到lpReturnedString缓冲区。
lpDefault:默认值,以空终止结尾的字符串。如果获取键值的键名不存在时,返回设置的默认值。
lpReturnedString:用于接受数据的缓冲区。
nSize:以字符为单位表示lpReturnedString缓冲区的大小。
lpFileName:INI文件名称,以空终止结尾的字符串。
返回值:
返回值是字符复制到缓冲区的数量,不包括终止null字符。
3、GetPrivateProfileInt
该函数用于从INI文件中获取整型数据。
函数原型如下:
UINTGetPrivateProfileInt(LPCTSTRlpAppName,//addressofsectionname LPCTSTRlpKeyName,//addressofkeyname INTnDefault,//returnvalueifkeynameisnotfound LPCTSTRlpFileName//addressofinitializationfilename );
参数说明:
lpAppName:节名。
lpKeyName:键名。
nDefault:默认值。
lpFileName:INI文件名称。
返回值:
函数返回实际读取的整数值。
4、GetPrivateProfileSectionNames
该函数用于返回INI文件中的所有节名。
函数原型如下:
DWORDGetPrivateProfileSectionNames( LPTSTRlpszReturnBuffer,//addressofreturnbuffer DWORDnSize,//sizeofreturnbuffer LPCTSTRlpFileName//addressofinitializationfilename );
参数说明:
lpszReturnBuffer:接受节名的数据缓冲区。
nSize:缓冲区的大小。
lpFileName:INI文件名称。
返回值:
返回值指定数量的字符复制到指定的缓冲,不包括终止null字符。
如果缓冲区没有大到足以包含所有相关的部分名称指定的初始化文件,返回值等于指定的长度nSize-2。
5、GetPrivateProfileSection
该函数用于获取指定节下的所有的键名和键值。
函数原型如下:
DWORDGetPrivateProfileSection( LPCTSTRlpAppName,//addressofsectionname LPTSTRlpReturnedString,//addressofreturnbuffer DWORDnSize,//sizeofreturnbuffer LPCTSTRlpFileName//addressofinitializationfilename );
参数说明:
lpAppName:节名。
lpReturnedString:用于接受数据的缓冲区。
nSize:缓冲区的大小。
lpFileName:INI文件名称。
返回值:
返回值指定数量的字符复制到缓冲区,不包括终止null字符。
如果缓冲区没有大到足以包含所有与指定相关联的键名称和值对部分,返回值等于nSize-2。
四、C++实现INI文件读写完整代码
CMyINI.h
#pragmaonce #include#include #include #include #include #include 
CMyINI.cpp
#include"StdAfx.h"
#include"MyINI.h"
#defineINIDEBUG
CMyINI::CMyINI()
{
}
CMyINI::~CMyINI()
{
}
//************************************************************************
//函数名称:	TrimString
//访问权限:	public
//创建日期:		2017/01/05
//创建人:		
//函数说明:		去除空格
//函数参数:	string&str	输入的字符串
//返回值:	std::string&	结果字符串
//************************************************************************
string&TrimString(string&str)
{
	string::size_typepos=0;
	while(str.npos!=(pos=str.find("")))
		str=str.replace(pos,pos+1,"");
	returnstr;
}
//************************************************************************
//函数名称:	ReadINI
//访问权限:	public
//创建日期:		2017/01/05
//创建人:		
//函数说明:		读取INI文件,并将其保存到map结构中
//函数参数:	stringpath	INI文件的路径
//返回值:	int
//************************************************************************
intCMyINI::ReadINI(stringpath)
{
	ifstreamin_conf_file(path.c_str());
	if(!in_conf_file)return0;
	stringstr_line="";
	stringstr_root="";
	vectorvec_ini;
	while(getline(in_conf_file,str_line))
	{
		string::size_typeleft_pos=0;
		string::size_typeright_pos=0;
		string::size_typeequal_div_pos=0;
		stringstr_key="";
		stringstr_value="";
		if((str_line.npos!=(left_pos=str_line.find("[")))&&(str_line.npos!=(right_pos=str_line.find("]"))))
		{
			//cout<map_tmp;
	for(vector::iteratoritr=vec_ini.begin();itr!=vec_ini.end();++itr)
	{
		map_tmp.insert(pair(itr->root,""));
	}	//提取出根节点
	for(map::iteratoritr=map_tmp.begin();itr!=map_tmp.end();++itr)
	{
#ifdefINIDEBUG
		cout<<"根节点:"<first<::iteratorsub_itr=vec_ini.begin();sub_itr!=vec_ini.end();++sub_itr)
		{
			if(sub_itr->root==itr->first)
			{
#ifdefINIDEBUG
				cout<<"键值对:"<key<<"="<value<key,sub_itr->value);
			}
		}
		map_ini.insert(pair(itr->first,sn));
	}
	return1;
}
//************************************************************************
//函数名称:	GetValue
//访问权限:	public
//创建日期:		2017/01/05
//创建人:		
//函数说明:		根据给出的根结点和键值查找配置项的值
//函数参数:	stringroot		配置项的根结点
//函数参数:	stringkey		配置项的键
//返回值:	std::string		配置项的值
//************************************************************************
stringCMyINI::GetValue(stringroot,stringkey)
{
	map::iteratoritr=map_ini.find(root);
	map::iteratorsub_itr=itr->second.sub_node.find(key);
	if(!(sub_itr->second).empty())
		returnsub_itr->second;
	return"";
}
//************************************************************************
//函数名称:	WriteINI
//访问权限:	public
//创建日期:		2017/01/05
//创建人:		
//函数说明:		保存XML的信息到文件中
//函数参数:	stringpath	INI文件的保存路径
//返回值:	int
//************************************************************************
intCMyINI::WriteINI(stringpath)
{
	ofstreamout_conf_file(path.c_str());
	if(!out_conf_file)
		return-1;
	//cout<::iteratoritr=map_ini.begin();itr!=map_ini.end();++itr)
	{
		//cout<first<first<<"]"<::iteratorsub_itr=itr->second.sub_node.begin();sub_itr!=itr->second.sub_node.end();++sub_itr)
		{
			//cout<first<<"="<second<first<<"="<second<::size_type	
//************************************************************************
vector::size_typeCMyINI::SetValue(stringroot,stringkey,stringvalue)
{
	map::iteratoritr=map_ini.find(root);	//查找
	if(map_ini.end()!=itr)
	{
		//itr->second.sub_node.insert(pair(key,value));
		itr->second.sub_node[key]=value;
	}	//根节点已经存在了,更新值
	else
	{
		SubNodesn;
		sn.InsertElement(key,value);
		map_ini.insert(pair(root,sn));
	}	//根节点不存在,添加值
	returnmap_ini.size();
}
//************************************************************************
//函数名称:	Travel
//访问权限:	public
//创建日期:		2017/01/05
//创建人:		
//函数说明:		遍历打印INI文件
//返回值:	void
//************************************************************************
voidCMyINI::Travel()
{
	for(map::iteratoritr=this->map_ini.begin();itr!=this->map_ini.end();++itr)
	{
		//root
		cout<<"["<first<<"]"<::iteratoritr1=itr->second.sub_node.begin();itr1!=itr->second.sub_node.end();
			++itr1)
		{
			cout<<""<first<<"="<second<
测试之前INI文件的内容:
测试程序:
CMyINI*p=newCMyINI();
p->ReadINI("Setting.ini");
cout<<"\n原始INI文件内容:"<Travel();
p->SetValue("setting","hehe","eheh");
cout<<"\n增加节点之后的内容:"<Travel();
cout<<"\n修改节点之后的内容:"<SetValue("kk","kk","2");
p->Travel();
p->WriteINI("Setting.ini");   
测试结果:
五、C++读写ini文件中的配置信息
ini文件是由若干个节(Sction)组成,每个节又由若干个键(Key)组成。
1、将文件写入ini文件中,主要使用的函数是WritePrivateProfileString(LPCWSTRIpAppName,LPCWSTRIpKeyName,LPCWSTRIpString,LPCWSTRIpFileName);
参数一表示节的名字,参数二表示键的名字,若为NULL,则删除整个节,参数三表示键的值,若为NULL,则删除这个键,参数四表示文件名。
#ifndefCONFIG_FILE
#defineCONFIG_FILE(_T("Config.ini"))
#endif
TCHARIniPath[MAX_PATH]={0}
GetModuleFileName(NULL,IniPath,Max_Path);
 TCHAR*pFind=_tcsrchr(IniPath,'\\');
if(pFind==NULL)
{
return;
}
*pFind='\0';
CStringnewIniPath=IniPath;
newIniPath+="\\";
newIniPath+=CONFIG_FILE;
写入........
2、将ini文件中的配置信息读取出来,主要使用的函数为 GetPrivateProfileString(LPCWSTRIpAppName,LPCWSTRIpKeyName,LPCWSTRIpDefault,LPCWSTRIpReturnedString,DWORDnSize,LPCWSTRIpFileName)和GetPrivateProfileInt(LPCWSTRIpAppName,LPCWSTRIpKeyName,IntnDefault,LPCWSTRIpFileName);
 GetPrivateProfileString:参数一表示节的名字,参数二表示键的名字,参数三表示如果指定的键名不存在时所默认的读取值,参数四用来接收读取的字符串,参数五指定lpReturnedString指向的缓冲区的大小 ,参数六表示文件名。
GetPrivateProfileInt:参数一表示节的名字,参数二表示键的名字,参数三表示如果指定的键名不存在时所默认的读取值,参数四表示文件名。
TCHARIniPath[MAX_PATH]={0};
GetModuleFileName(NULL,IniPath,Max_Path);
IniPath[_tcslen(IniPath)-1]='i'
IniPath[_tcslen(IniPath)-2]='n'
IniPath[_tcslen(IniPath)-3]='i'
if(!PathFileExists(IniPath))
{}
读取...........
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
                                