inifile 一个轻量级的INI文件解析库

inifile 一个轻量级的INI文件解析库

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

INI文件的格式

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

  • 段(sections)
    [section]
  • 参数(parameters)
    name=value
  • 注释(comments)
    ;comments

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

重要说明

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

[sys_table]
table_id=1
max_column_id=11
table_type=1
#rowkey is table name
rowkey_is_fixed_length=0
column_info=table_name,varchar,128
column_info=table_id,int
column_info=table_type,int
column_info=rowkey_len,int
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 &section,const
    string &key,string &value);
  • 获取section段第一个键为key的值,并将值赋到value中,将注释赋到comment中
    int getValue(const string &section,const
    string &key,string &value,string &comment);
  • 获取section段所有键为key的值,并将值赋到values的vector中
    int getValues(const string &section,const
    string &key,vector<string> &values);
  • 获取section段所有键为key的值,并将值赋到values的vector中,将注释赋到comments的vector中
    int getValues(const string &section,const
    string &key,vector<string> &value,vector<string> &comments);
  • 获取section段的注释
    int getSectionComment(const string &section,string
    & comment);
  • 获取注释标记符列表
    void getCommentFlags(vector<string> &flags);
  • 设置注释标记符列表
    void setCommentFlags(const vector<string>
    &flags);

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

  • 将内容保存到当前文件
    int save();
  • 将内容另存到一个名为fname的文件
    int saveas(const string &fname);
  • 同时设置值和注释
    int setValue(const string &section,const
    string &key,const string &value,const string &comment="");
  • 删除段
    void deleteSection(const string &section);
  • 删除特定段的特定参数
    void deleteKey(const string &section,const
    string &key);
  • 设置section段的注释
    int setSectionComment(const string &section,const
    string & comment);

IniFile的特点

  • 支持解析ini文件
  • 支持修改、保存ini文件
  • 支持设置多个注释符,默认为“#”和';'
  • 支持参数名重复

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

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

IniFile的使用

使用很简单 生成一个ini文件test.ini
cat > test.ini

#this is commit
;this is commit
[COMMON]
DB = mysql
PASSWD=root

首先指定头文件和命名空间 然后使用open函数打开ini文件 getValue可以获取指定段的指定项的值

#include "inifile.h"
using namespace inifile;

filepath = "test.ini";

IniFile ini;

ini.open(filepath);

//获取指定段的指定项的值
string db_name = ini.getValue("COMMON","DB");
//设置新值和注释
ini.setValue("TEST","NAME","root","用户名称");
//保存到文件
ini.save();

IniFile库的地址为:

https://github.com/Winnerhust/inifile2



欢迎光临我的网站----蝴蝶忽然的博客园----人既无名的专栏
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!

时间: 2024-09-05 00:41:50

inifile 一个轻量级的INI文件解析库的相关文章

Windows XP下BOOT.INI文件解析

电脑中安装有多个操作系统的朋友知道,在电脑加电自检后会出现一个启动菜单,它列出了在这台电脑上安装的所有的操作系统,用户使用"↑""↓"键可以选择进入哪个系统.实际上这一切都源于一个名为BOOT.INI的文件,自Windows NT开始它就存在于Windows系统中.Windows XP主要依赖BOOT.INI文件来确定计算机在重启(引导)过程中显示的可供选取的操作系统类别.一般情况下,它位于C盘根目录下,在默认状态下是一个隐藏只读的系统配置文件.要查看它,只要去掉

介绍一个轻量级java的swf处理库

  提取swf文件元信息.压缩swf.解压swf都可以处理,来自于http://www.brooksandrus.com/blog/category/java/,或者直接这里下载. 一个小例子:          SWFHeader header = new SWFHeader("G:\\mplayer\\test.swf");         System.out.println("signature:   " + header.getSignature());

JavaScript实现解析INI文件内容的方法_javascript技巧

本文实例讲述了JavaScript实现解析INI文件内容的方法.分享给大家供大家参考,具体如下: .ini 是Initialization File的缩写,即初始化文件,ini文件格式广泛用于软件的配置文件. INI文件由节.键.值.注释组成. 根据node.js版本的node-iniparser改写了个JavaScript函数来解析INI文件内容,传入INI格式的字符串,返回一个json object. function parseINIString(data){ var regex = {

关于C#读取INI文件出现的问题

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Data.SqlClient;usingSystem.Data;namespacedblink{publicclassClass1{[DllImport("kernel32")]privatestaticexternlongWr

关于.ini文件内容的修改与查找

问题描述 我有一个后缀为.ini文件,现在想将该文件中如下内容中的172.30.15:9080改为172.30.0.14:8080请大家提供点思路或者详细代码,万分感谢~~~~wsdl=http://172.30.0.15:9080/g3_bs/services/webserver?wsdlurl=http://172.30.0.15:9080/g3_bs/services/webserverport=CXFServiceImplPortservice=CXFServiceImplService

Android开发之XML文件解析的使用_Android

前言  本文主要介绍在Android中怎样来解析XML文件.主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包.作为接口,SAX是事件驱动型XML解析的一个标准接口.XML文件解析一般有2种方法,DOM和SAX.其中DOM需要先将xml文档全部读入到电脑内存中,当文档内容太大时,该方法并不适用.SAX就比较好的解决了该问题,它是逐行解析的,可以随时中断.但是SAX的操作比较复杂.因此,这2种方法各有优缺点,看具体应用情况.在前面的文章Qt学习

Android开发之XML文件解析的使用

前言 本文主要介绍在Android中怎样来解析XML文件.主要采用的是SAX机制,SAX全称为Simple API for XML,它既是一种接口,也是一个软件包.作为接口,SAX是事件驱动型XML解析的一个标准接口.XML文件解析一般有2种方法,DOM和SAX.其中DOM需要先将xml文档全部读入到电脑内存中,当文档内容太大时,该方法并不适用.SAX就比较好的解决了该问题,它是逐行解析的,可以随时中断.但是SAX的操作比较复杂.因此,这2种方法各有优缺点,看具体应用情况.在前面的文章Qt学习之

win32-用汇编语言写一个.ini文件处理程序

问题描述 用汇编语言写一个.ini文件处理程序 用汇编语言编写一个命令行程序,能处理.ini文件,功能类似inifile.exe(http://home.mnet-online.de/horst.muc/wbat32.htm#inifile). 必须自行实现对.ini文件的处理,不得调用具有处理.ini文件能力的其它程序的现成功能. inifile.exe是用来处理ini文件的.用 inifile.exe /? 可看到帮助内容. 这是我们的一个作业,但是我是新手所以不知道该从何入手.所以想问问有

全面解析BOOT.INI文件和让启动菜单“锦上添花”

全面解析BOOT.INI文件和让启动菜单"锦上添花"一.把"安全模式添加到启动菜单,----------------------------------------------------------------------------------------------- [boot loader]timeout=5default=multi(0)disk(0)rdisk(0)partition(2)WIN_XP[operating systems]multi(0)disk