cv_gordon

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

在C++程序中,如果我们把程序中的参数都保存在txt文本中,运行时再去读取。这样的好处是,当我们需要调参的时候,不需要每次都重新编译程序,大大提升了效率。

今日分享一份实现以上功能的代码,代码来源:https://www.cnblogs.com/gaoxiang12/p/4669490.html

文件夹结构

.
├── build
│   └──parameter.txt
├── CMakeLists.txt
├── include
│   └── base.h
└── src
    └── test.cpp

 

在 include/base.h 头文件中

// 参数读取类
class ParameterReader
{
public:
    ParameterReader( string filename="./parameters.txt" )
    {
        ifstream fin( filename.c_str() );
        if (!fin)
        {
            cerr<<"parameter file does not exist."<<endl;
            return;
        }
        while(!fin.eof())
        {
            string str;
            getline( fin, str );
            if (str[0] == '#')
            {
                // 以‘#’开头的是注释
                continue;
            }

            int pos = str.find("=");
            if (pos == -1)
                continue;
            string key = str.substr( 0, pos );
            string value = str.substr( pos+1, str.length() );
            data[key] = value;

            if ( !fin.good() )
                break;
        }
    }
    string getData( string key )
    {
        map<string, string>::iterator iter = data.find(key);
        if (iter == data.end())
        {
            cerr<<"Parameter name "<<key<<" not found!"<<endl;
            return string("NOT_FOUND");
        }
        return iter->second;
    }
public:
    map<string, string> data;
};

 

它读的参数文件如下, parameter.txt

# 这是一个参数文件
# 去你妹的yaml! 我再也不用yaml了!简简单单多好!

detector=SIFT
descriptor=SIFT
good_match_threshold=4

# camera
camera.cx=325.5;
camera.cy=253.5;
camera.fx=518.0;
camera.fy=519.0;
camera.scale=1000.0;

 

主函数文件,src/test.cpp

#include <iostream>
#include <string>
#include "../include/basefunction.h"

int main(int argc, char** argv)
{
    ParameterReader pr;
    float a1 = atof( pr.getData( "camera.fx" ).c_str());
    string a2 = pr.getData( "detector" );
    std::cout<<"camera.fx : "<<a1<<std::endl;
    std::cout<<"detector : "<<a2<<std::endl;

    return 0;
}

 

编译文件CMakeList.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
set (CMAKE_CXX_STANDARD 11)
SET(CMAKE_BUILD_TYPE Debug)

# project name,指定项目的名称,一般和项目的文件夹名称对应
project(TEST)

  # source directory,源文件目录
  AUX_SOURCE_DIRECTORY(src DIR_SRCS)

  # set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执  行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
  SET(TEST_MATH
  ${DIR_SRCS}
  )

# 头文件目录
INCLUDE_DIRECTORIES(
include
)

  #6.add executable file,添加要编译的可执行文件
  ADD_EXECUTABLE(test ${TEST_MATH}

 

之后通过cmake编译即可。 

posted on 2018-08-15 20:28  cv_gordon  阅读(1378)  评论(0编辑  收藏  举报