gpt4 book ai didi

c++ - 使用 boost::{program_options,property_tree} 读/写 ini 文件

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:27 25 4
gpt4 key购买 nike

利用boost,我想

  1. 从 ini 文件中读取选项,如果在 ini 文件中遇到未知选项则中止
  2. 稍后将它们保存在另一个 ini 文件中。

第一部分可以用 boost::program_options 完成:

try{
inifile_options.add_options()
("ops1.i0", po::value<int>(&p.nx)->default_value(1), "test integer")
;

po::variables_map vm;
po::store(po::parse_config_file(pthfnini, inifile_options), vm);
po::notify(vm);
}
catch(exception& e){
cerr << "error: " << e.what() << "\n";
errorflag=1;
}

据我所知,使用 boost::program_options 编写 ini 文件是不可能的,但是 boost::property_tree 可以:

pt::ptree iniPropTree;
pt::ini_parser::write_ini("./used0.ini",iniPropTree);

现在的问题是如何将存储在 po::variables_map 中的数据转换为 pt::ptree?

阅读 boost 文档给我的印象是这是不可能的。以下是唯一可行的方法吗?

iniPropTree.put<int>("ops1.i0",vm["ops1.i0"].as<int>();

根据我的口味,它引入了相当多的冗余。但是,从一开始就将数据读入属性树似乎不支持检查未定义/拼写错误的选项。

或者,是否可以迭代 variables_map 的内容并以某种方式推断出每个元素的相应数据类型?

完整代码在这里:

/*
* g++ iniOps_test.cpp -Wall -std=c++11 -O3 -lboost_system -lboost_program_options -o iniOps_test.exe
*
*/

// C++11 & Boost libraries
#include <boost/program_options.hpp> // po::options_description, po::variables_map, ...
#include <boost/property_tree/ptree.hpp> // pt::ptree
#include <boost/property_tree/ini_parser.hpp> // write_ini()
#include <iostream> // cout
#include <fstream> // ofstream, ifstream


// namespaces
namespace po = boost::program_options;
namespace pt = boost::property_tree;
using namespace std;


struct params{
std::string inipthfn;
int i0;
};


void read_inifile(params &p, po::variables_map &vm){

// initialize variables
int errorflag=0;
std::ifstream pthfnini("./testini.ini");
po::options_description inifile_options("Allowed inifile options");

try{
inifile_options.add_options()
("ops1.i0", po::value<int>(&p.i0)->default_value(1), "test integer")
;

;
po::store(po::parse_config_file(pthfnini, inifile_options), vm);
po::notify(vm);
}
catch(exception& e){
cerr << "error: " << e.what() << "\n";
errorflag=1;
}

pthfnini.close();
if(errorflag){ std::cout<<"--- program shutdown due to error in read_inifile ---"<<std::endl; exit(1); }
}


int main(){

params p;
po::variables_map vm;
pt::ptree iniPropTree;

read_inifile(p,vm); // get options from inifile

// ??? conversion from vm -> pt ???

pt::ini_parser::write_ini("./used0.ini",iniPropTree); // save options to used.ini
cout << p.i0 << endl;

return 0;
}

ini文件“testini.ini”的内容是:

[ops1]
i0=2

最佳答案

这里有一个概念上的问题。

命令行参数本质上是文本的。

变量映射中的值不是。使用的类型在值语义中配置(选项描述的一部分)。

如果您的所有选项都具有相同的类型,您可以“作弊”并对转换进行硬编码:

pt::ptree to_ptree(po::variables_map const& vm) {
pt::ptree tree;
for (auto& v : vm) {
if (!v.second.empty() && !v.second.defaulted())
tree.put(v.first, v.second.as<int>());
}

return tree;
}

节省:

[ops1]
i0=1

如果您需要更大的灵 active ,您至少需要访问选项说明。这不是该库的预期用途,您可能很快就会遇到未记录的实现部分。

关于c++ - 使用 boost::{program_options,property_tree} 读/写 ini 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50233440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com