ini.h代碼
公司主營業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出蘭陵免費(fèi)做網(wǎng)站回饋大家。
#ifndef INI_H
#define INI_H
#include
#include
using namespace std;
#define CONFIGLEN 256
enum INI_RES
{
INI_SUCCESS, //成功
INI_ERROR, //普通錯(cuò)誤
INI_OPENFILE_ERROR, //打開文件失敗
INI_NO_ATTR //無對(duì)應(yīng)的鍵值
};
// 子鍵索引 子鍵值
typedef map
// 主鍵索引 主鍵值
typedef map
// config 文件的基本操作類
class CIni
{
public:
// 構(gòu)造函數(shù)
CIni();
// 析夠函數(shù)
virtual ~CIni();
public:
//獲取×××的鍵值
int GetInt(const char* mAttr, const char* cAttr);
//獲取鍵值的字符串
char *GetStr(const char* mAttr, const char* cAttr);
// 打開config 文件
INI_RES OpenFile(const char* pathName, const char* type);
// 關(guān)閉config 文件
INI_RES CloseFile();
protected:
// 讀取config文件
INI_RES GetKey(const char* mAttr, const char* cAttr, char* value);
protected:
// 被打開的文件局柄
FILE* m_fp;
char m_szKey[CONFIGLEN];
MAINKEYMAP m_Map;
};
#endif
ini.cpp代碼
#include "ini.h"
/******************************************************************************
* 功 能:構(gòu)造函數(shù)
* 參 數(shù):無
* 返回值:無
* 備 注:
******************************************************************************/
CIni::CIni()
{
memset(m_szKey, 0, sizeof(m_szKey));
m_fp = NULL;
}
/******************************************************************************
* 功 能:析構(gòu)函數(shù)
* 參 數(shù):無
* 返回值:無
* 備 注:
******************************************************************************/
CIni::~CIni()
{
m_Map.clear();
}
/******************************************************************************
* 功 能:打開文件函數(shù)
* 參 數(shù):無
* 返回值:
* 備 注:
******************************************************************************/
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--;
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鍵值模板的內(nèi)容 如注釋等
}
}
}
//插入最后一次主鍵
m_Map[szLastMainKey] = mLastMap;
return INI_SUCCESS;
}
/******************************************************************************
* 功 能:關(guān)閉文件函數(shù)
* 參 數(shù):無
* 返回值:
* 備 注:
******************************************************************************/
INI_RES CIni::CloseFile()
{
if (m_fp != NULL)
{
fclose(m_fp);
m_fp = NULL;
}
return INI_SUCCESS;
}
/******************************************************************************
* 功 能:獲取[SECTION]下的某一個(gè)鍵值的字符串
* 參 數(shù):
* char* mAttr 輸入?yún)?shù) 主鍵
* char* cAttr 輸入?yún)?shù) 子鍵
* char* value 輸出參數(shù) 子鍵鍵值
* 返回值:
* 備 注:
******************************************************************************/
INI_RES CIni::GetKey(const char* mAttr, const char* cAttr, char* pValue)
{
KEYMAP mKey = m_Map[mAttr];
string sTemp = mKey[cAttr];
strcpy(pValue, sTemp.c_str());
return INI_SUCCESS;
}
/******************************************************************************
* 功 能:獲取×××的鍵值
* 參 數(shù):
* cAttr 主鍵
* cAttr 子鍵
* 返回值:正常則返回對(duì)應(yīng)的數(shù)值 未讀取成功則返回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;
}
/******************************************************************************
* 功 能:獲取鍵值的字符串
* 參 數(shù):
* 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;
}
config.ini
[cctv.thrift]
IP=192.168.37.123
Port=7001
username=admin
password=admin
測試
static void ReadIniFile()
{
CIni ini;
ini.OpenFile("config.ini", "r");
char *pVal1 = ini.GetStr("cctv.thrift", "IP");
int nKey = ini.GetInt("cctv.thrift", "Port");
}
注意
GetStr返回的字符串,必須馬上保存到其他的變量中,如果這個(gè)時(shí)候重新調(diào)用GetInt,上面的pVal1的值將會(huì)改變