注释的逻辑
Closed this issue · 6 comments
这里面把[section]前面的注释都作为section->comment保存起来。
那下面这样的结构,
#####################################################################
[Translation]
TRANSLATION_BY = Prevedel
TRANSLATION_NAME = Jadran Rudec , jrudec@gmail.com
TRANSLATION_LINK = http://www.mikrodata.si/english/employee.htm#jadran
LANGUAGENAME = Slovenski jezik
FILEVER = 3160
#File version = 3.2.7
#####################################################################
[Common]
SYSTEM_FONT_NAME = tahoma
SYSTEM_FONT_SIZE = 8
SYSTEM_TITLE_BOLD = 1
SYSTEM_EDITOR_PANEL_SIZEOVERFLOW = 0
POPUPMARGIN =35
[Common]上面两行本属于[Translation]里面的注释就会附属到 Common->comment 中,
在后面的 save 中,从[Common]中得到的comment 就会包含[Translation]中的#File version = 3.2.7
,还会改变原来的注释结构。比如:
#File version = 3.2.7
#####################################################################
[Common]
SYSTEM_FONT_NAME = tahoma
SYSTEM_FONT_SIZE = 8
SYSTEM_TITLE_BOLD = 1
SYSTEM_EDITOR_PANEL_SIZEOVERFLOW = 0
POPUPMARGIN =35
#####################################################################
[Translation]
TRANSLATION_BY = Prevedel
TRANSLATION_NAME = Jadran Rudec , jrudec@gmail.com
TRANSLATION_LINK = http://www.mikrodata.si/english/employee.htm#jadran
LANGUAGENAME = Slovenski jezik
FILEVER = 3160
当然,如果不考虑注释的话,就很容易解决了。
感觉这里不是因为注释的问题,而是因为sections_是个有序容器,inifile添加段的代码中:
sections_[s] = section;
s是段名,使用段名作为游标,造成迭代器遍历section时无法按照ini文件原来的section顺序去遍历,因此造成先打印了section_[Common]的内容再打印section_[Translation]的问题,只因为T字母排在C字母后面,这个问题很容易验证,你如果把Translation改成Aranslation,就会先打印Aranslation段再打印Common段。
知道问题所在,解决办法就很简单了,将map容器换成unordered_map即可
试了一下unordered_map,发现会倒序输出,因为unordered_map的存储方式是FILO结构,所有最好还是用一个vector专门记录段名、键名,增加一个判断唯一值函数
哦哦, 谢谢.
我fork了一个版本,并创建了一个v2.0的分支版本,已向原作者提交了merge申请,v2.0做了大量修改,map替换成了vector,注释格式、空白都能完美保留,感兴趣的可以看看。不过我发现安装新版googletest后无法编译testcase,目前已注释掉testcase的编译项
https://github.com/edaplayer/inifile2/tree/v2.0
主线版本已合入,多谢@tanfuyuan