Boost Info Parser读写INFO文件时如何保留注释?
如何用Boost Info Parser读写INFO文件时保留注释?
Boost.PropertyTree的Info Parser确实不会保留注释——它在解析阶段就直接忽略了所有注释内容,所以写回文件的时候自然没办法还原它们,就像你测试的例子里,原文件的;this is a key4注释直接消失了。
下面给你几个可行的解决思路:
方案1:手动处理注释(预处理+后处理)
如果你必须基于Boost Info Parser来做,可以自己加一层注释的保存和恢复逻辑:
- 先手动读取原始配置文件,用正则或者字符串匹配把所有注释的位置、内容记录下来(比如INFO格式里的注释以
;开头) - 再把去掉注释的纯配置内容传给Boost Info Parser解析和修改
- 最后写回文件时,把之前记录的注释插回对应的位置
这种方法有点繁琐,需要你自己维护注释和配置节点的对应关系,适合注释不多、格式比较固定的场景。
方案2:换用支持保留注释的配置库
Boost Info Parser的设计目标就是只处理配置数据,不保留原文件的格式和注释。如果你的场景对保留注释要求很高,不如直接换用更适合的库:
libconfig:专门为配置文件设计,原生支持保留注释和原文件格式yaml-cpp:YAML格式本身支持注释,读写时可以保留注释(注意遵循YAML的注释规则)- 要是INFO格式很简单,甚至可以自己写个轻量的解析器,专门处理带注释的场景
另外要提一句,Boost.PropertyTree的write_info还会重新格式化输出(比如调整空格、换行),就算没有注释,原文件的排版也可能被改变——这也是它的设计逻辑,只保证数据正确,不保证格式一致。
内容的提问来源于stack exchange,提问作者Saurab Dulal
相关产品推荐
相关产品推荐

