用C ++解析配置文件的更好方法

时间:2016-07-07 18:22:00

标签: c++ parsing

我目前正在开发一个解析器项目,将一些文件xml格式1转换为另一种xml格式。

我完成了我的项目,并且有许多参数需要知道,其中大多数是一些文件的路径,参数列表,......

我希望它易于使用,所以我创建一个settings.txt:它包含像

这样的行
someparameter = defaultvalue

这个文件很容易修改。我认为人们想要解析具有相同参数的文件,所以我的应用程序就像:

Do you want to change parameters? (Y/N)
if(yes){
Do you want to change paramater 1? //If no value, [] stays
                   [pathbydefault]
}
...
else{ load from settings.txt}

为了实现这一点,我使用getline(),首先拆分'='并将它们放在std :: map中。 我认为这是一个糟糕的选择,我搜索了一下,我找到了很多c ++的架构:list(10个参数真的很重),表格(不易读,代码对其他人来说很暗)。

您建议我使用什么解决方案? 当然,我不会要求实施,只是为了考虑一些解决方案。

一些信息:我不认为它是否重要,但我在基于Unix的系统(Mac OS或Linux)上工作,所以我不能使用Windows库。我看到了Windows解决方案,但我没有进一步研究它。

2 个答案:

答案 0 :(得分:0)

使用这些东西(IMHO)的经验法则是始终使用一个好的库来解析标准数据格式,至少在您的需求可能会继续扩展的任何情况下。例如,我倾向于真正喜欢JSON,因为它是一种简单易用的人类读/写格式,在C ++中有很多优质的选择。

这避免了必须自己处理任何容易出错的解析逻辑。它也使得例如很容易编写生成或验证配置文件的python脚本(因为python也很容易访问json,就像每种语言一样)。

在您的代码中,将数据格式和集合清晰地分离到地图或您正在使用的任何数据结构中也是一个好主意。这样,如果您决定更改您使用的数据格式,代码中将会更改的部分将被包含。

答案 1 :(得分:0)

未来的一个考虑因素是使用XML转换语言在旧的XML文件格式和新的XML文件格式之间进行转换。我不确定你是否已经这样做过,所以如果你这样做,请不要理会。如果您不熟悉,这些语言中最常见的是XSLT(可扩展样式表语言转换)。

最终用户不是让最终用户向INI风格的配置文件输入无数的选项/路径/值,而是理想情况下只提供XML(可以手工编辑)/ XSLT模板文件到XSLT处理器。您可以更新C ++应用程序,以减少从最终用户获取每个输入的重点,更多地关注创建/选择正确的XML / XSLT模板文件。

当你提到在基于Unix的系统上工作时,你可能想要考虑这个处理器:http://xml.apache.org/xalan-c/