ini文件是一种常见的配置文件。它以简单的文字与简单的结构组成.INI文件会以不同的扩展名,如".ini.",".cfg",".conf"等。

INI文件的格式

INI文件由3个重要的部分组成:参数(parameters),段(sections)和注释(comments).其格式如下:

  • 段(sections) 
    [section]

  • 参数(parameters) 
    name=value

  • 注释(comments) 
    ;comments

每个段包括段名,注释,和一定的参数对,段名不可重复。段内的参数对是有序的,可重复的
注释一般以分号“;”开头,在分号后面的文字,直到该行结尾都全部为注解。但是也有很多的配置文件的注释是以“#”开头的。

重要说明

一般来说,段与段直接的名字是不能重复的。而段内的参数对是有序的,可重复的。虽然这种重复参数的情况比较少,但是有些地方还是会用到的。如OceanBase数据库的 Schema配置文件如下。

  1. [sys_table]  

  2. table_id=1  

  3. max_column_id=11  

  4. table_type=1  

  5. #rowkey is table name  

  6. rowkey_is_fixed_length=0   

  7. column_info=table_name,varchar,128  

  8. column_info=table_id,int   

  9. column_info=table_type,int  

  10. column_info=rowkey_len,int  

  11. column_info=max_column_id,int  


INI文件不一定有段名,通常此时会为其增加一个默认的段名.

示例中存在段名,段名为sys_table,在配置文件中不能再存在其他sys_table段,而该段中的存在多个column_info参数,每个参数表示sys_table中的一个字段的信息。参数rowkey_is_fixed_length还带有注释。

注释是提高配置文件可读性的重要方法。在解析的过程中一般会被忽略。但是如果你准备给你的解析库添加一个保存到文件的功能的话,就应该考虑到用户可能会为每个参数或者段添加注释的可能性。

IniFile的接口设计

接口设计必须要保证足够的稳定性和易用性。INI配置文件通常是启动时读,一旦启动程序,中途几乎不会修改配置文件。所以一个简单的解析库,首要目标是解决INI文件的解析,然后是在内存中修改内容,以及将内存修改后的内容保存到INI文件中去。
完整的解析至少要包括以下功能:

  • 打开并解析一个名为fname的INI文件
    int open(const string &fname);

  • 获取section段第一个键为key的值,并将值赋到value中
    int getValue(const string §ion,const string &key,string &value);

  • 获取section段第一个键为key的值,并将值赋到value中,将注释赋到comment中
    int getValue(const string §ion,const string &key,string &value,string &comment);

  • 获取section段所有键为key的值,并将值赋到values的vector中
    int getValues(const string §ion,const string &key,vector &values);

  • 获取section段所有键为key的值,并将值赋到values的vector中,将注释赋到comments的vector中
    int getValues(const string §ion,const string &key,vector &value,vector &comments);

  • 获取section段的注释
    int getSectionComment(const string §ion,string & comment);

  • 获取注释标记符列表
    void getCommentFlags(vector &flags);

  • 设置注释标记符列表 
    void setCommentFlags(const vector &flags);

如果要在程序中修改INI文件设置的值,并将修改后的内容保存到原来的INI文件或者其他文件,则需要包括以下功能:

  • 将内容保存到当前文件 
    int save();

  • 将内容另存到一个名为fname的文件 
    int saveas(const string &fname);

  • 同时设置值和注释 
    int setValue(const string §ion,const string &key,const string &value,const string &comment="");

  • 删除段 
    void deleteSection(const string §ion);

  • 删除特定段的特定参数 
    void deleteKey(const string §ion,const string &key);

  • 设置section段的注释 
    int setSectionComment(const string §ion,const string & comment);

IniFile的特点

  • 支持解析ini文件

  • 支持修改、保存ini文件

  • 支持设置多个注释符,默认为“#”和';'

  • 支持参数名重复

IniFile库既包含了INI文件的解析,也能够修改并保存INI文件。
解析过程中如果INI文件中没有指定段名,则会指定一个空字符串作为段名,段采用map保存,而段中的参数则采用vector保存,因此支持参数名重复。

IniFile除了适合用在一般后台程序读取配置文件,也能够帮助GUI界面程序提供参数配置,修改,保存等。


转载地址:http://blog.csdn.net/qq910894904/article/details/38583485