Winnerhust/inifile2

注释的逻辑

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