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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: inifile 一个轻量级的INI文件解析库 ini文件是一种常见的配置文件。它以简单的文字与简单的结构组成.INI文件会以不同的扩展名,如".ini.",".cfg",".conf"等。 INI文件的格式 INI文件由3个重要的部分组成:参数(parameters),段(sections)和注释(comments).其格式如下: 段(sectio

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

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


相关文章
|
15天前
云解析分享文件
这座建筑结合了现代设计与和谐的自然景观。大面积的玻璃窗让居住者可以充分享受美景和阳光,同时保证了室内充足的自然光线。是体验宁静生活与自然之美的理想之地。图片展现了其优美的自然环境和现代建筑设计的完美融合。
38 6
云解析分享文件
|
4天前
|
XML JSON 网络协议
超级好用的C++实用库之字节流解析器
超级好用的C++实用库之字节流解析器
|
20天前
|
JSON 前端开发 JavaScript
解析JSON文件
解析JSON文件
57 9
|
15天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
47 3
|
4天前
|
缓存 网络协议 分布式数据库
超级好用的C++实用库之DNS解析
超级好用的C++实用库之DNS解析
14 0
|
7天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
2月前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
51 0
|
2月前
|
测试技术 PHP 开发工具
深入解析 Laravel 中的 Composer Lock 文件
【8月更文挑战第31天】
22 0
|
2月前
|
测试技术 PHP 开发工具
深入解析 Laravel 中的 Composer Lock 文件
【8月更文挑战第31天】
21 0
|
2月前
|
XML 存储 JavaScript
xml介绍与解析,及xml库包使用
xml介绍与解析,及xml库包使用
26 0

推荐镜像

更多
下一篇
无影云桌面