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
- Linux下读取Ini文件类
- linux 读取Ini文件类
- C#下读取INI文件类
- Ini文件读取类
- ini文件读取类
- Linux C 读取.ini文件
- INI 文件读取专用类
- CIniFile类,读取INI文件
- ini文件读取通用类
- 在VC程序下读取INI文件
- Win32环境下的ini文件读取
- C#读取基目录下.ini文件
- Win32环境下的ini文件读取
- Win32环境下的ini文件读取
- Linux下用C读取INI配置文件
- Linux下用C读取INI配置文件
- Linux、Window下INI文件的读写操作C++类
- (转)CIniFile类,读取INI文件
- sqlite3使用简介
- 线程池
- FFmpeg编程学习笔记一
- Linux 运行32位程序步骤
- mysql复制一条数据
- Linux下读取Ini文件类
- C语言指针学习 一
- Chart.js使用教程,画折线图实例
- html网页兼容手机浏览器(解决显示页面很小的问题)
- android 底部控件,随软键盘弹出,跟着上移
- Android关于又返回的跳转 startActivityForResult()方法
- ProGuard的作用、使用及bug分析
- C语言指针学习 二
- Convolutional Neurons Network 训练参数与连接数计算过程