我有一个相当大的C++应用程序(在Windows上,没有计划其他平台),它目前存储Windows注册表中的所有设置(甚至某种地址).
有时这很不方便,因为用户在更改注册表中的条目时遇到困难.我想设置版本,因此设置始终与当前代码匹配.目前我们对reg-files进行了版本控制,但是如果所有的reg文件都已添加到目标计算机上,那么您永远不会确定.使用C#,您可以在app.config中定义默认值,但不要覆盖现有设置.我不知道,如果C++存在这样的机制或库.
我想拥有以下"功能":
据我所知,在Windows上存储设置有3种可能性:
我们套件中只有一个应用程序目前使用Qt,但Boost可用.
对于地址,我们会将它们放在某种XML地址簿中,但对于其他设置,我们不确定,最佳做法是什么.
根据文档,我可以解析样式中的配置文件:
[main section]
string = hello world.
[foo]
message = Hi !
Run Code Online (Sandbox Code Playgroud)
但我需要解析插件列表:
[plugins]
somePlugin.
HelloWorldPlugin
AnotherPlugin
[settings]
type = hello world
Run Code Online (Sandbox Code Playgroud)
如何获取插件部分中的字符串向量?
试图编译这个cfgparser示例.
$ g++ example.cc -lcfgparser
: In function `main':
example.cc:(.text+0x6b): undefined reference to `ConfigParser_t::readFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
example.cc:(.text+0x160): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) const'
example.cc:(.text+0x2d9): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*) const'
example.cc:(.text+0x43c): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double*) const'
example.cc:(.text+0x5b1): undefined reference to `ConfigParser_t::getValue(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool*) const'
example.cc:(.text+0x78c): …Run Code Online (Sandbox Code Playgroud) 我的任务很简单 - 我只需要解析这样的文件:
Apple = 1
Orange = 2
XYZ = 3950
Run Code Online (Sandbox Code Playgroud)
但我不知道可用密钥的集合.我使用C#解析这个文件比较容易,让我演示源代码:
public static Dictionary<string, string> ReadParametersFromFile(string path)
{
string[] linesDirty = File.ReadAllLines(path);
string[] lines = linesDirty.Where(
str => !String.IsNullOrWhiteSpace(str) && !str.StartsWith("//")).ToArray();
var dict = lines.Select(s => s.Split(new char[] { '=' }))
.ToDictionary(s => s[0].Trim(), s => s[1].Trim());
return dict;
}
Run Code Online (Sandbox Code Playgroud)
现在我只需要使用c ++做同样的事情.我想要使用,boost::property_tree::ptree但似乎我不能迭代ini文件.它很容易阅读ini文件:
boost::property_tree::ptree pt;
boost::property_tree::ini_parser::read_ini(path, pt);
Run Code Online (Sandbox Code Playgroud)
但是不可能迭代它,参考这个问题Boost程序选项 - 获取部分中的所有条目
问题是 - 在C++上编写C#代码模拟的最简单方法是什么?