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; }