#include "ConfigDeal.h" /****************************************************************************** * 功 能:构造函数 * 参 数:无 * 返回值:无 * 备 注: ******************************************************************************/ CIni::CIni() { memset(m_szKey, 0, sizeof(m_szKey)); m_fp = NULL; } /****************************************************************************** * 功 能:析构函数 * 参 数:无 * 返回值:无 * 备 注: ******************************************************************************/ CIni::~CIni() { m_Map.clear(); } /****************************************************************************** * 功 能:打开文件函数 * 参 数:无 * 返回值: * 备 注: ******************************************************************************/ INI_RES CIni::OpenFile(const char* pathName, const char* type) { string szLine, szMainKey, szLastMainKey, szSubKey; char strLine[CONFIGLEN] = { 0 }; KEYMAP mLastMap; int nIndexPos = -1; int nLeftPos = -1; int nRightPos = -1; m_fp = fopen(pathName, type); if (m_fp == NULL) { printf("open inifile %s error!\n", pathName); return INI_OPENFILE_ERROR; } m_Map.clear(); while (fgets(strLine, CONFIGLEN, m_fp)) { szLine.assign(strLine); //删除字符串中的非必要字符 nLeftPos = szLine.find("\n"); if (string::npos != nLeftPos) { szLine.erase(nLeftPos, 1); } nLeftPos = szLine.find("\r"); if (string::npos != nLeftPos) { szLine.erase(nLeftPos, 1); } //判断是否是主键 nLeftPos = szLine.find("["); nRightPos = szLine.find("]"); if (nLeftPos != string::npos && nRightPos != string::npos) { szLine.erase(nLeftPos, 1); /*nRightPos–-;*/ nRightPos--; szLine.erase(nRightPos, 1); m_Map[szLastMainKey] = mLastMap; mLastMap.clear(); szLastMainKey = szLine; } else { //是否是子键 if (nIndexPos = szLine.find("="), string::npos != nIndexPos) { string szSubKey, szSubValue; szSubKey = szLine.substr(0, nIndexPos); szSubValue = szLine.substr(nIndexPos + 1, szLine.length() - nIndexPos - 1); mLastMap[szSubKey] = szSubValue; } else { //TODO:不符合ini键值模板的内容 如注释等 } } } //插入最后一次主键 m_Map[szLastMainKey] = mLastMap; fclose(m_fp); m_fp = NULL; /* 需要指向空,否则会指向原打开文件地址 */ return INI_SUCCESS; } /****************************************************************************** * 功 能:关闭文件函数 * 参 数:无 * 返回值: * 备 注: ******************************************************************************/ INI_RES CIni::CloseFile() { if (m_fp != NULL) { fclose(m_fp); m_fp = NULL; } return INI_SUCCESS; } /****************************************************************************** * 功 能:获取[SECTION]下的某一个键值的字符串 * 参 数: * char* mAttr 输入参数 主键 * char* cAttr 输入参数 子键 * char* value 输出参数 子键键值 * 返回值: * 备 注: ******************************************************************************/ INI_RES CIni::GetKey(const char* mAttr, const char* cAttr, char* pValue) { KEYMAP mKey = m_Map[mAttr]; string sTemp = mKey[cAttr]; //printf("___ %s \n", sTemp.c_str()); strcpy(pValue, sTemp.c_str()); return INI_SUCCESS; } /****************************************************************************** * 功 能:获取整形的键值 * 参 数: * cAttr 主键 * cAttr 子键 * 返回值:正常则返回对应的数值 未读取成功则返回0(键值本身为0不冲突) * 备 注: ******************************************************************************/ int CIni::GetInt(const char* mAttr, const char* cAttr) { int nRes = 0; memset(m_szKey, 0, sizeof(m_szKey)); if (INI_SUCCESS == GetKey(mAttr, cAttr, m_szKey)) { nRes = atoi(m_szKey); } return nRes; } /****************************************************************************** * 功 能:获取键值的字符串 * 参 数: * cAttr 主键 * cAttr 子键 * 返回值:正常则返回读取到的子键字符串 未读取成功则返回"NULL" * 备 注: ******************************************************************************/ char *CIni::GetStr(const char* mAttr, const char* cAttr) { memset(m_szKey, 0, sizeof(m_szKey)); if (INI_SUCCESS != GetKey(mAttr, cAttr, m_szKey)) { strcpy(m_szKey, "NULL"); } return m_szKey; }