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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 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

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


相关文章
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
108 2
|
20天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
94 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
自然语言处理 数据处理 Python
python操作和解析ppt文件 | python小知识
本文将带你从零开始,了解PPT解析的工具、工作原理以及常用的基本操作,并提供具体的代码示例和必要的说明【10月更文挑战第4天】
606 60
|
2月前
|
数据采集 JavaScript API
网页解析库:BeautifulSoup与Cheerio的选择
网页解析库:BeautifulSoup与Cheerio的选择
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
55 3
|
2月前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
2月前
|
存储 Go PHP
Go语言中的加解密利器:go-crypto库全解析
在软件开发中,数据安全和隐私保护至关重要。`go-crypto` 是一个专为 Golang 设计的加密解密工具库,支持 AES 和 RSA 等加密算法,帮助开发者轻松实现数据的加密和解密,保障数据传输和存储的安全性。本文将详细介绍 `go-crypto` 的安装、特性及应用实例。
144 0
|
3月前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
26天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
26天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多