参数更改较频繁,若将参数写入到程序内,每次更改都需编译验证,为减少编译可在程序初始化过程中,从文件读取参数,可进行调参。
/*
*parameter: file_path 文件的绝对路径名如: /user/home/my.cfg
* key 文本中的变量名 如 num
* def 对应变量的默认值
* readConfig 返回string类型 readConfigFloat 返回float类型 readConfigInt 返回Int类型
*
*/
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
string readConfig(string file_path, const string & key,string def)
{
const char * cfgfilepath=file_path.c_str();
fstream cfgFile;
string value;
string no_value="error";
cfgFile.open(cfgfilepath);//打开文件
if( ! cfgFile.is_open())
{
cout<<"can not open cfg file!"<<endl;
return no_value;
}
char tmp[100];
while(!cfgFile.eof())//循环读取每一行
{
cfgFile.getline(tmp,100);//每行读取前1000个字符,1000个应该足够了
string line(tmp);
size_t pos = line.find('=');//找到每行的“=”号位置,之前是key之后是value
if(pos==string::npos) return def;
string tmpKey = line.substr(0,pos);//取=号之前
if(key==tmpKey)
{
value = line.substr(pos+1);//取=号之后
return value;
}
}
return def;
}
float readConfigFloat(string file_path, const string & key,float def)
{
const char * cfgfilepath=file_path.c_str();
fstream cfgFile;
string value;
float no_value=-1;
cfgFile.open(cfgfilepath);//打开文件
if( ! cfgFile.is_open())
{
cout<<"can not open cfg file!"<<endl;
return no_value;
}
char tmp[100];
while(!cfgFile.eof())//循环读取每一行
{
cfgFile.getline(tmp,100);//每行读取前1000个字符,1000个应该足够了
string line(tmp);
size_t pos = line.find('=');//找到每行的“=”号位置,之前是key之后是value
if(pos==string::npos) return def;
string tmpKey = line.substr(0,pos);//取=号之前
if(key==tmpKey)
{
value = line.substr(pos+1);//取=号之后
return atof(value.c_str());
}
}
return def;
}
int readConfigInt(string file_path, const string & key,int def)
{
const char * cfgfilepath=file_path.c_str();
fstream cfgFile;
string value;
int no_value=-1;
cfgFile.open(cfgfilepath);//打开文件
if( ! cfgFile.is_open())
{
cout<<"can not open cfg file!"<<endl;
return no_value;
}
char tmp[100];
while(!cfgFile.eof())//循环读取每一行
{
cfgFile.getline(tmp,100);//每行读取前100个字符,100个应该足够了
string line(tmp);
size_t pos = line.find('=');//找到每行的“=”号位置,之前是key之后是value
if(pos==string::npos) return def;
string tmpKey = line.substr(0,pos);//取=号之前
if(key==tmpKey)
{
value = line.substr(pos+1);//取=号之后
return atoi(value.c_str());
}
}
return def;
}
int main()
{
string yaml_path="a.yaml";
string Hello=readConfig(yaml_path,"hello","hello");
float num=readConfigFloat(yaml_path,"num",100.0);
int num_i=readConfigInt(yaml_path,"num_i",10);
int num_a=readConfigInt(yaml_path,"num_a",20);
cout<<"num is "<<num<<endl;
cout<<"num_i is "<<num_i<<endl;
cout<<"num_a is "<<num_a<<endl;
std::cout<<Hello<<std::endl;
}
从a.yaml文件读取数据,若不存在返回第三个默认值。注意等号左边无空格
hello=hello world
num=1.0
num_i=18