zoukankan      html  css  js  c++  java
  • 【C++】读取参数的类

    在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编译即可。 

  • 相关阅读:
    js apply的用法
    js 键盘点击事件
    jquery 中 attr 和 prop 的区别
    css实现等高布局 两栏自适应布局 三栏自适应布局
    Python多线程同步命令行模拟进度显示
    Windows上Python3.5安装Scrapy(lxml)
    Ubuntu14.04右键菜单添加Sublime 2打开选项
    Git使用笔记(一)
    C# Winform程序本地化应用
    修改Windows系统的启动Shell
  • 原文地址:https://www.cnblogs.com/gdut-gordon/p/9483818.html
Copyright © 2011-2022 走看看