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