天天看点

ini格式数据生成与解析详解

1、ini格式数据长啥样?

2、ini格式数据简介

INI文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。

有时候,INI文件也会以不同的扩展名,如“

.cfg”、“.conf

”(在Linux系统中也常用到)、或是“.txt”代替

(从辨识度的角度,不建议使用)

3、ini格式数据适用场景

INI文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在windows或是其他OS(Linux等)上。

4、常用开源的CIniFile注意事项?

http://www.codeforge.cn/read/181985/memleak_test.cpp__html

1)将iniFile.h、iniFile.cpp包含到自己的工程中;

2)读取的时候需要进行配置文件路径初始化,函数接口:构造函数或者Initialize( ).

解析前需要将所有配置文件ini

格式数据读取到缓存区以便解析

,函数接口:ReadFile( ).

5、构造ini格式数据

//ini文件初始化、写入文件测试.
void BuildAndWriteIniToFile()
{
    CIniFile iniFile( "./ini_oracle_test.ini");
    
    //读取文件
    iniFile.ReadFile();
 
 
    //读取ini文件中的session个数.
    cout << "NKeys = " << iniFile.NumKeys() << endl;
 
 
 
 
    //new add array_data 新增数据
    iniFile.SetValue( "section3", "TASK_ID", "3");   //格式为:session--Key--Value形式.
    iniFile.SetValue( "section3", "SYSTEM_ID", "22");
    iniFile.SetValue( "section3", "TASK_NAME", "\"test\"");
    iniFile.SetValue( "section3", "START_TIME", "25-11月-14 02.49.00.000000000  下午");
    iniFile.SetValue( "section3", "END_TIME", "25-11月-14 02.55.00.000000000 下午    ");
    iniFile.SetValue( "section3", "EVENT_ID", "3");
    iniFile.SetValue( "section3", "AUTO_PROBE", "N");
 
 
    //写入文件
    iniFile.WriteFile();
 
 
    // Lookup what we have now. 查询key个数.
    for ( unsigned keyID = 0; keyID < iniFile.NumKeys(); ++keyID)
    {
        cout << "Key = " << iniFile.KeyName( keyID) << endl;
 
 
        //查询对应key的value个数.
        for ( unsigned valueID = 0; valueID < iniFile.NumValues( keyID); ++valueID)
        {
            cout << "   ValueName = " << iniFile.ValueName( keyID, valueID) <<
                "  Value = " << iniFile.GetValue( keyID, valueID) << endl;
        }//end for valueID
    }//end for keyID
 
 
 
 
}           

6、解析ini格式数据

//读取并解析iniFile
void ReadAndParseServerIni()
{
    const string strConfigPath = string(g_pszServerConfig);
    CIniFile iniFile;
    
    //初始化,设置ini文件路径.
    iniFile.Initialize(strConfigPath);
 
    //读取文件.
    iniFile.ReadFile();
 
    /********************************************************
    [listen]
    listen_port=7200
    ********************************************************/
    //获取对应Session为listen, key为listen_port 对应的value值.
    int nPort = iniFile.GetValueI( "listen", "listen_port");
    cout << nPort << endl;
 
    string strDBIp = iniFile.GetValue("Oracle_conn_info", "DBIP");
    int    iDBPort = iniFile.GetValueI("Oracle_conn_info", "DBPort");
    string strDBSId = iniFile.GetValue("Oracle_conn_info", "DBSID");
    string strDBUserName = iniFile.GetValue("Oracle_conn_info", "DBUserName");
    string strDBPassword = iniFile.GetValue("Oracle_conn_info", "DBPassword");
 
    cout << strDBIp << "\t" << iDBPort << "\t" << strDBSId << "\t" << strDBUserName << "\t" << strDBPassword << endl;
 
    //获取对应Session下的每个key的名称。
    string strPath = iniFile.GetValueName("EnvConfig",0);
    string strTnsName = iniFile.GetValueName("EnvConfig",1);
    string strNlsLang = iniFile.GetValueName("EnvConfig",2);
    cout << strPath << "\t" << strTnsName << "\t" << strNlsLang << endl;
 
    //获取一个Session下的"key-value"对数。
    cout << iniFile.NumValues("EnvConfig") << endl;
 
}           

7、ini格式数据解析源码

下载地址:

http://download.csdn.net/detail/wojiushiwo987/8871011

8、运行结果示意:

后记:

1) 项目中发现公司中对.ini、.conf格式数据存在多个版本的解析,大多都是前辈们自己写的,多半都是有大大小小的bug,不便于自己使用。而以上CIniFile使用简单,没必要重复“造轮子”,可以很方便移植到项目中。

2)已经对作者的代码发现问题做了几处小的改动,后续发现Bug还会持续更新代码。

作者:铭毅天下

转载请标明出处,原文地址:

http://blog.csdn.net/laoyang360/article/details/46764715

继续阅读