ini 配置文件使用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngpan1101/article/details/73773296

本博文由 youngpan1101 出品,转载请注明出处。
文章链接: http://blog.csdn.net/youngpan1101/article/details/73773296
作者: 宋洋鹏(youngpan1101)
邮箱: [email protected]


简介

  • 一旦程序需要修改一些参数必须要修改程序代码本身并重新编译,为了让程序出厂后还能根据需要进行必要的配置,所以要用配置文件;
  • 配置文件有很多种,如 INI 配置文件,XML 配置文件,cfg 配置文件,还有就是可以使用系统注册表等;
  • INI 就是英文 “initialization” 的头三个字母的缩写;当然 INI file 的后缀名也不一定是 .ini 也可以是 .cfg,.conf 或者是 .txt。

运行 Demo

  1. 下载 inifile.cpp 和 inifile.h 文件,复制到工程目录下的 3rdParty/inifile 文件夹里 【Download

  2. CMakeLists.txt

    cmake_minimum_required(VERSION 2.8)
    project( Sample )
    
     # produce lib
    SET(IniFileParse_CPP  ${PROJECT_SOURCE_DIR}/3rdParty/inifile/inifile.cpp)
    ADD_LIBRARY(IniFileParse  SHARED  ${IniFileParse_CPP})
    
    include_directories( ${PROJECT_SOURCE_DIR}/3rdParty )
    
    add_executable( main main.cpp )
    
    TARGET_LINK_LIBRARIES( main  IniFileParse )
  3. main.cpp

     #include <iostream>
     #include <sstream>
    
     #include "inifile/inifile.h"
    
    //模板函数:将string类型变量转换为常用的数值类型(此方法具有普遍适用性)  
    template <class Type>  
    Type stringToNum(const std::string& str){  
        istringstream iss(str);  
        Type num;  
        iss >> num;  
        return num;      
    } 
    
    void getPara(const std::string& iniPath){
        std::cout << "load ini file to get parameters" << std::endl;
    
        inifile::IniFile ini;   
    
        int flag = ini.load(iniPath);
    
        int ret = 0;   // ret = 0 : succeed to get the parameter , otherwise -1 means fail
    
        int valTmp = ini.getIntValue("CameraID", "ID", ret);
        if(-1 == ret){
            std::cout << "can not get the CameraID from given ini file" << std::endl;
        }
        std::cout << "ret = " << ret << std::endl;
        std::cout << "valTmp = " << valTmp << std::endl;
    
        std::string strTmp = ini.getStringValue("Camera_Info", "SN", ret);
        if(-1 == ret){
            std::cout << "can not get the SN from given ini file" << std::endl;
        }
        std::cout << "ret = " << ret << std::endl;
        std::cout << "strTmp = " << strTmp << std::endl;
    
        double dValTmp = ini.getDoubleValue("Camera_Info", "image_width", ret);
        if(-1 == ret){
            std::cout << "can not get the image_width from given ini file" << std::endl;
        }
        std::cout << "ret = " << ret << std::endl;
        std::cout << "dValTmp = " << dValTmp << std::endl;
    
        // 2 x 4 Matrix 
        std::stringstream Matrix_1(ini.getStringValue("Camera_Info", "Matrix_row_1", ret));
        double num[4];
        for (int i = 0; i < 4; ++i)
        {
          std::string singleValueStr;
          getline(Matrix_1, singleValueStr, ',');
          num[i] = stringToNum<double>(singleValueStr);
        }
        std::cout << "num[0] = " << num[0] << " num[1] = " << num[1] << " num[2] = " << num[2] << " num[3] = " << num[3] << std::endl;
    
        std::stringstream Matrix_2(ini.getStringValue("Camera_Info", "Matrix_row_2", ret));
        for (int i = 0; i < 4; ++i)
        {
          std::string singleValueStr;
          getline(Matrix_2, singleValueStr, ',');
          num[i] = stringToNum<double>(singleValueStr);
        }
        std::cout << "num[0] = " << num[0] << " num[1] = " << num[1] << " num[2] = " << num[2] << " num[3] = " << num[3] << std::endl;
    }
    
    int main (int argc, char** argv){
        std::cout << "ini file parse..." << std::endl;
    
        std::string iniPath = "/home/hwj/Code/sample/para.ini";
    
        getPara(iniPath);
    
        return 1;
    }
  4. para.ini

    [CameraID]
    ID=3      ; the id of camera used to get video stream
    
    [Camera_Info]
    SN=HW_987654321    ; serial number of camera
    image_width=640
    Matrix_row_1=1,2.34,5.4,5.5  
    Matrix_row_2=11,12.34,15.4,15.5
  5. 编译运行

    $ cd build
    $ cmake ..
    $ make
    $ sudo ./main

Reference

猜你喜欢

转载自blog.csdn.net/youngpan1101/article/details/73773296