C++读取INI配置文件类实例详解
本文以实例讲解了C++读取配置文件的方法。
一般情况下,我们都喜欢使用ini扩展名的文件作为配置文件,可以读取及修改变量数值,也可以设置新的组,新的变量,本文的实例代码一个是读取INI的定义文件,另一个是CIniFile类实现文件,两者结合,完美实现VC++对INI文件的读写。
用户接口说明:在成员函数SetVarStr和SetVarInt函数中,当iType等于零,则如果用户制定的参数在ini文件中不存在,则就写入新的变量.当iType不等于零,则如果用户制定的参数在ini文件中不存在,就不写入新的变量,而是直接返回FALSE。程序代码如下示,部分关键点有注释加以说明:
/*==================================================================
=文件名:CIniFile类定义文件
=主要功能:可以读取.修改变量数值,可以设置新的组,新的变量
====================================================================*/
#ifndef_CINIFILE_H_
#define_CINIFILE_H_
#include<afxtempl.h>
//用户接口说明:在成员函数SetVarStr和SetVarInt函数中,当iType等于零,则如果用户制定的参数在ini文件中不存在,
//则就写入新的变量.当iType不等于零,则如果用户制定的参数在ini文件中不存在,就不写入新的变量,而是直接返回FALSE;
classCIniFile
{
public:
CIniFile();
virtual~CIniFile();
private:
CIniFile(constCIniFile&);
CIniFile&operator=(constCIniFile&);
public:
//创建函数
BOOLCreate(constCString&strFileName);
//得到变量整数型数值
BOOLGetVarInt(constCString&,constCString&,int&);
//得到变量字符串型数值
BOOLGetVarStr(constCString&,constCString&,CString&);
//重新设置变量整数型数值
BOOLSetVarInt(constCString&,constCString&,constint&,constintiType=1);
//重新设置变量字符串型数值
BOOLSetVarStr(constCString&,constCString&,constCString&,constintiType=1);
private:
BOOLGetVar(constCString&,constCString&,CString&);
BOOLSetVar(constCString&,constCString&,constCString&,constintiType=1);
intSearchLine(constCString&,constCString&);
private:
CArrayFileContainer;
BOOLbFileExsit;
CStdioFilestfFile;
CStringstrInIFileName;
};
#endif
CIniFile.cpp文件内容:
#include<afxtempl.h>
#include"CIniFile.h"
CIniFile::CIniFile():bFileExsit(FALSE)
{
}
CIniFile::~CIniFile()
{
if(bFileExsit)
{
if(stfFile.Open(strInIFileName,CFile::modeCreate|CFile::modeWrite)&&FileContainer.GetSize()>0)
{
CStringstrParam;
for(inti=0;i<FileContainer.GetSize();i++)
{
strParam=FileContainer[i];
//stfFile.WriteString(strParam);
stfFile.WriteString(strParam+_T("\n"));
}
}
stfFile.Close();
}
if(FileContainer.GetSize()>0)
{
FileContainer.RemoveAll();
}
}
BOOLCIniFile::Create(constCString&strFileName)
{
bFileExsit=FALSE;
strInIFileName=strFileName;
if(!stfFile.Open(strFileName,CFile::modeRead))
{
returnbFileExsit;
}
CStringstrFileLine;
while(bFileExsit=stfFile.ReadString(strFileLine))
{
if(bFileExsit==FALSE)
returnbFileExsit;
FileContainer.Add(strFileLine);
}
stfFile.Close();
bFileExsit=TRUE;
returnbFileExsit;
}
BOOLCIniFile::GetVar(constCString&strSection,constCString&strVarName,CString&strReturnValue)
{
if(bFileExsit==FALSE||FileContainer.GetSize()<0)
returnbFileExsit;
intiLine=SearchLine(strSection,strVarName);
if(iLine>0)
{
CStringstrParam=FileContainer[iLine-1];
strReturnValue=strParam.Mid(strParam.Find(_T("="))+1);
returnTRUE;
}
returnFALSE;
}
BOOLCIniFile::GetVarStr(constCString&strSection,constCString&strVarName,CString&strReturnValue)
{
return(GetVar(strSection,strVarName,strReturnValue));
}
BOOLCIniFile::GetVarInt(constCString&strSection,constCString&strVarName,int&iValue)
{
CStringstrReturnVar;
if(GetVar(strSection,strVarName,strReturnVar))
{
strReturnVar.TrimLeft();
intiLen=strReturnVar.GetLength();
iValue=_tstoi(strReturnVar.GetBuffer(iLen));
returnTRUE;
}
returnTRUE;
}
BOOLCIniFile::SetVar(constCString&strSection,constCString&strVarName,constCString&strVar,constintiType)
{
if(bFileExsit==FALSE)
returnbFileExsit;
if(FileContainer.GetSize()==0)
{
FileContainer.Add(_T("[")+strSection+_T("]"));
FileContainer.Add(strVarName+_T("=")+strVar);
returnTRUE;
}
inti=0;
intiFileLines=(int)FileContainer.GetSize();
//for(pInterator;pInterator!=FileContainer.end();++pInterator)
//{
while(i<iFileLines)
{
CStringstrValue=FileContainer.GetAt(i++);
strValue.TrimLeft();
if((strValue.Find(_T("["))>=0)&&(strValue.Find(strSection)>=0))
{
while(i<iFileLines)
{
CStringstrSectionList=FileContainer[i++];
strSectionList.TrimLeft();
if(strSectionList.Find(_T("//"))>=0)//找到注释行
continue;
if(strSectionList.Find(strVarName)>=0)//找到
{
CStringstrParam=strVarName+"="+strVar;
//FileContainer.SetAt(i-1,strParam);
FileContainer[i-1]=strParam;
returnTRUE;
}
if(strSectionList.Find(_T("["),0)>=0)//在原来文件的SECTION中,没有相应的变量需要添加而且,这种情况下,下边还有别的section
{
//处理流程是这样的,首先把当前的数值依次向后移动,然后在当前位置加入新出现的数值
if(iType!=0)
returnFALSE;
CStringstrParam;
FileContainer.Add(strParam);
intiPre=(int)(FileContainer.GetSize()-1);
while(iPre>=i)
{
CStringstrBehind=FileContainer[iPre-1];
FileContainer[iPre]=strBehind;
iPre--;
}
strParam=strVarName+_T("=")+strVar;
FileContainer.SetAt(i-1,strParam);
returnTRUE;
}
if(i==iFileLines&&iType==0)
{
FileContainer.Add(strVarName+_T("=")+strVar);
returnTRUE;
}
}
}
}
if(iType==0)
{
FileContainer.Add(_T("[")+strSection+_T("]"));
FileContainer.Add(strVarName+_T("=")+strVar);
}
returnTRUE;
}
BOOLCIniFile::SetVarStr(constCString&strSection,constCString&strVarName,constCString&strValue,constintiType)
{
returnSetVar(strSection,strVarName,strValue,iType);
}
BOOLCIniFile::SetVarInt(constCString&strSection,constCString&strVarName,constint&iValue,constintiType)
{
CStringstrVar;
strVar.Format(_T("%d"),iValue);
return(SetVar(strSection,strVarName,strVar,iType));
}
intCIniFile::SearchLine(constCString&strSection,constCString&strVarName)
{
if(FileContainer.GetSize()>0)
{
inti=0;
intiFileLines=(int)FileContainer.GetSize();
while(i<iFileLines)
{
CStringstrValue=FileContainer[i++];
strValue.TrimLeft();
if(strValue.Find(_T("["))>=0&&strValue.Find(strSection,1)>=0)
{
while(i<iFileLines)
{
CStringstrSectionList=FileContainer[i++];
strSectionList.TrimLeft();
if(strSectionList.Find(_T("//"))>=0)//找到注释行
continue;
if(strSectionList.Find(strVarName)>=0)//找到
{
returni;
}
if(strSectionList.Find(_T("["),0)>=0)//另外一个段落出现,寻找失败
{
return-2;
}
}
}
}
}
return-1;
}