在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[] == '#')
{
// 以‘#’开头的是注释
continue;
} int pos = str.find("=");
if (pos == -)
continue;
string key = str.substr( , pos );
string value = str.substr( pos+, 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= # 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 ;
}
编译文件CMakeList.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
set (CMAKE_CXX_STANDARD )
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编译即可。