更改程序的参数,而不需要重新编译程序
使用ini文件
在ini文件中,可以按照以下格式进行配置:
[x_pose]
value=0.5
[y_pose]
value=0.5
[z_pose]
value=1
其中,`[x_pose]`、`[y_pose]`、`[z_pose]`为配置项名称section
,`value`为配置项的值。
在cpp文件中,可以使用第三方库如boost或者Qt提供的QSettings类来读取ini文件。
boost库读取ini文件
以boost库为例,可以按照以下方式读取ini文件:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <iostream>
int main()
{
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("example.ini", pt);
float x_pose = pt.get<float>("x_pose.value");
float y_pose = pt.get<float>("y_pose.value");
float z_pose = pt.get<float>("z_pose.value");
std::cout << "x_pose: " << x_pose << std::endl;
std::cout << "y_pose: " << y_pose << std::endl;
std::cout << "z_pose: " << z_pose << std::endl;
return 0;
}
在以上代码中,`example.ini`为你的ini配置文件名,`x_pose.value`、`y_pose.value`、`z_pose.value`即为对应的配置项名称和值。运行上述代码即可读取配置文件中的参数。
使用Cmake编译程序。
CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
project(lab1)
add_executable(lib main.cpp)
然后创建“build”文件夹,在文件夹里打开终端,执行“cmake ..”“make”,生成可执行文件lib,“./lib”执行。执行输出结果:
x_pose: 0.5
y_pose: 0.5
z_pose: 1
libini.a库
你可以使用INI文件类来实现读写INI配置文件,具体步骤如下:
1. 编写INI配置文件,将路径写入配置文件中。例如,在myconfig.ini文件中添加以下内容:
[Section1]
FilePath=/usr/myhome/123.txt
2. 在程序中引入INI文件类,并读取配置文件中的路径。例如:
#include <iostream>
#include "ini/INI.h"
int main() {
// 读取配置文件
INIReader reader("myconfig.ini");
if (reader.ParseError() < 0) {
std::cout << "Failed to load ini file." << std::endl;
return 1;
}
// 读取配置参数
std::string filePath = reader.Get("Section1", "FilePath", "");
// 打开文件并读取内容
std::ifstream ifs(filePath);
if (!ifs.is_open()) {
std::cout << "Failed to open file: " << filePath << std::endl;
return 1;
}
std::string line;
while (std::getline(ifs, line)) {
std::cout << line << std::endl;
}
return 0;
}
需要注意的是,上述代码中需要引入`INI.h`头文件,并在链接时链接`libini.a`库文件。
另外,如果INI配置文件和程序不在同一个目录下,需要指定配置文件的绝对路径或相对路径。
但是ini库没有实验成功,还是用boost库:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
//读取ini配置文件,不需要需要using namespace std;
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("../example.ini", pt);
// 读取配置参数
std::string filePath =pt.get<string>("Section1.FilePath");
// 打开文件并读取内容
std::ifstream ifs(filePath);
if (!ifs.is_open()) {
std::cout << "Failed to open file: " << filePath << std::endl;
return 1;
}
std::string line;
while (std::getline(ifs, line)) {
std::cout << line << std::endl;
}
return 0;
}
总结:
ini文件写成如下形式
[section1]
name1=value1
name2=value2
name3=value3
[section2]
name1=value1
...
用boost库在程序中读取:
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini("example.ini", pt);float sec1_name1 = pt.get<float>("
section1.name1
");
float sec1_name2= pt.get<float>("section1
.name2");
float sec2_name1 = pt.get<float>("section2
.name1
");
使用命令行参数或环境变量也是在不重新编译代码的情况下动态调整程序参数的常见方式。
使用命令行参数
使用命令行参数的方法如下:
1. 在程序中定义需要动态设置的变量,例如:
int myVar1 = 100;
string myVar2 = "hello";
double myVar3 = 1.23;
2. 在程序启动时,解析命令行参数并将其作为相应变量的值,例如:
int main(int argc, char** argv) {
// 解析命令行参数
for (int i = 1; i < argc; i += 2) {
if (strcmp(argv[i], "-myVar1") == 0) {
myVar1 = atoi(argv[i+1]);
} else if (strcmp(argv[i], "-myVar2") == 0) {
myVar2 = argv[i+1];
} else if (strcmp(argv[i], "-myVar3") == 0) {
myVar3 = atof(argv[i+1]);
}
}
// 程序正常执行
// ...
}
3. 启动程序时,通过命令行参数来设置相应变量的值,例如:
$ ./my_program.exe -myVar1 200 -myVar2 world -myVar3 3.14
使用环境变量
使用环境变量的方法如下:
1. 在程序中定义需要动态设置的变量,例如:
int myVar1 = atoi(getenv("MY_VAR_1") ?: "100");
string myVar2 = (getenv("MY_VAR_2") ?: "hello");
double myVar3 = atof(getenv("MY_VAR_3") ?: "1.23");
2. 在启动程序之前,通过设置相应的环境变量来设置程序参数的值,例如:
$ export MY_VAR_1=200
$ export MY_VAR_2=world
$ export MY_VAR_3=3.14
$ ./my_program.exe
需要注意的是,使用命令行参数或环境变量的方式需要手动设置,并不方便管理。如果需要管理较多的参数,还是建议使用配置文件的方式。