Linux下读取Ini文件类

来源:互联网 发布:申请无地域名公司 编辑:程序博客网 时间:2024/05/08 15:19

Linux下读取Ini文件类

最近项目上有需要读取Ini文件 所谓Ini文件也就是文本文档 并且以
//注释1
/*注释2
[Section]
Key1=aaa
Key2=bbb
这种形式存在的文档
自己编写了一个类  比较使用 简单 可以跨平台读写INI文件
头文件Ini.h
#include <map>#include <string>using namespace std;#define CONFIGLEN           256 enum INI_RES{    INI_SUCCESS,            //成功    INI_ERROR,              //普通错误    INI_OPENFILE_ERROR,     //打开文件失败    INI_NO_ATTR            //无对应的键值};//              子键索引    子键值 typedef map<std::string,std::string> KEYMAP;//              主键索引 主键值  typedef map<std::string,KEYMAP> MAINKEYMAP;// config 文件的基本操作类class CIni {public:    // 构造函数    CIni();    // 析够函数    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);    // 关闭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 // FILLE_H

实现文件Ini.cpp
#include "Ini.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--;   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;    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 ];  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;}

用法:比如读取
[Section1]
key1=1
key2=abcdw
[Section2]
key1=3
key2=ddba
 
CIni  ini;
ini.OpenFile("./Test.ini","r" );
char *pVal1 = ini.GetStr("Section1","key2");
int  nKey = ini.GetInt("Section2","key1");
 
再封装一下
#define INIINT( a ,b )   ini.GetInt(a,b)
#define INISTR(a,b)   ini.GetStr(a,b)
 
读取所有的字段都可以用 以下形式
int a=INIINT(...... )
strcpy( szTemp,INIStr(a,b) )
0 0
原创粉丝点击