Linux下读取Ini文件类

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) )

时间: 2024-11-03 21:20:38

Linux下读取Ini文件类的相关文章

windows和linux下读取文件乱码的终极解决办法!

乱码是个很恶心的问题. windows和linux读取txt文件,一旦读取了,编码发生改变,就无法再还原了,只有重启项目. 网上有很多方法都是读取文件头,方法很好,但是亲测都不能用(右移8位判断0xff的,取3个字节的-1,-2的,大体上网上最多就这两种). 后来偶然发现一个方法,CharsetPrinter. 这个方法需要引入jar包,非常好用. public static String guessEncoding(String filename) { try { CharsetPrinter

Linux下几种文件传输命令

Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于

C#读取ini文件的方法

最近项目用到ini文件,读取ini文件,方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.Specialized; using System.IO; using System.Runtime.InteropServices; using System.Windows.Forms; namespace test{ /

Linux下读取默认MAC地址

Linux下读取默认MAC地址 导读 MAC(Media Access Control,介质访问控制)计算机通过它来定义并识别网络设备的位置.在嵌入式linux学习中不可避免也会遇到MAC,本文主要描述了如何通过操作OTP来读取嵌入式linux设备网卡中的MAC地址! 一.适用范围 这里主要介绍读取网卡MAC地址的方法,适用于EasyARM-i.MX287A开发套件,其应用原理及配套示例也适用于下表1.1所列出的产品型号. 二.原理介绍 MAC(Media Access Control,介质访问

linux下的 lib文件的学习思考

说到这个LIB文件,先从一个小故障说起. 某日开发说,一台测试用虚机可以PING通SSH不能连了.运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢? 测试下,不管连自己还是其他机,都是报错 这里注意看,提示你有个libcom_err.so.2共享库文件找不到. 询问开发,才了解他们测试一个软件,意外删除了某个库文件. 那么在正常的相同虚机的机器查看下,再和出错的虚机比对下,发现少了2个库文件 挂载系统光盘或从正常的虚机上把这个两个文件拷贝过来,放到lib64

C# 读取Ini配置文件类

配置文件 为fileName.ini 的文件 第一行必须为空,不然读不出值 [section1] key=value key2=value ......... [section2] key=value key2=value ......... 代码如下: using System; using System.Runtime.InteropServices; using System.Text; namespace Test { /// <summary> /// INI文件的操作类 /// &

【转载】在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间

在windows下,一个文件有:创建时间.修改时间.访问时间.而在Linux下,一个文件也有三种时间,分别是:访问时间.修改时间.状态改动时间. 两者有此不同,在Linux下没有创建时间的概念,也就是不能知道文件的建立时间,但如果文件建立后就没有修改过,修改时间=建立时间;如果文件建立后,状态就没有改动过,那么状态改动时间=建立时间;如果文件建立后,没有被读取过,那么访问时间=建立时间,因为不好判断文件是否被改过.读过.其状态是否变过,所以判断文件的建立时间基本上能为不可能. 如何查一个文件的三

关于Linux下的连接文件学习总结

1.连接文件区分为两种,一种类似windows下快捷方式,使用户能够快速连接到目标文件或目录. 另一种则通过文件系统中的inode连接来产生新文件名,而不是产生新文件. 两种方式分别称为符号/硬连接. 2. 每个文件都会占用一个inode,其中记录了文件的权限和属性等信息,而文件内容由inode指向的block来记录. 而想读取文件的内容,必须先经过文件所在目录block中记录的文件名来指向正确的inode号码才能读取. 所以文件名只与目录有关,但文件内容与inode相关. 3. 硬连接的由来:

[转帖]Linux下主机间文件传输命令

Linux下主机间文件传输命令 https://yq.aliyun.com/articles/53631?spm=a2c4e.11155435.0.0.580ce8ef4Q9uzs SCP命令: 简介: scp 命令在网络上的主机之间拷贝文件,它是安全拷贝(secure copy)的缩写. scp 命令使用 ssh 来传输数据,并使用与 ssh 相同的认证模式,提供同样的安全保障. 如果有公钥打通就不用密码,如果没有就会提示输入密码. 用法: 1 #Copy 本地文件 /etc/eva.log,