首页 程序笔记 C++跨平台的Ini文件解析开源代码Leksys' INI Parser

C++跨平台的Ini文件解析开源代码Leksys' INI Parser

前言

Ini文件在Windows上可以使用GetPrivateProfileString系列函数,在Linux中也有多种可以选择的ini文件解析,比如iniparser,libconfini等,但这些库都需要链接一个动态库或静态库,在项目管理中有点不方便,Leksys’ INI Parser是一个跨平台的ini解析C++源码开源项目,只有一个.hpp文件,在项目中加入这个文件就行,而不需要再链接动态库或静态库。

Leksys’ INI Parser的优点

  • 只有在项目中需要引用单个文件iniparser.hpp中
  • 跨平台(Windows和POSIX)
  • 好用的C++接口
  • 扩展标准INI接口:
    数组(逗号分隔的值,即:“val1,val2,val3”)
    映射(逗号分隔的对,即:“key1:value,key2:value”)
    嵌套节(即:“[父项.子项]”)
    嵌套数组和映射(即:“val1,{val2.1,val2.2},{k31:v31,k32:v32}”)
    文件包含(;#include<File_path>)
  • 可以用于保存和加载任何用户定义的类,只要提供了流运算符
  • 支持跨行
  • 可以加载和保存注释

使用方法

项目地址:https://github.com/Lek-sys/LeksysINI
添加提供的iniparser.hpp到您的C++项目,仅此而已。在代码中,可以使用不同的方法设置和获取值,如下所示:

#include iostream
#include iniparser.hpp

int main(int argc, char** argv)
{
	int ival;
	double dval;
	// Creating ini file object
	INI::File ft;
	// Loading from file
	if (!ft.Load(settings.ini))
	{
		// Loading from stream
		std::ifstream op(opts.ini,std::ios::in);
		if (op.is_open())
			op  ft;
	}
	// Set value1 in section Main to 20
	ft.GetSection(Main)-SetValue(value1,20);
	// get value1 from section Main. If there is no such entry return default value 1
	ival = ft.GetSection(Main)-GetValue(value1,1).AsInt();
	// get value2 from section Main, defaulting to 2
	ival = ft.GetValue(Main:value2,2).AsInt();
	// set value1 in subsection subsect of section Main
	ft.SetValue(Main.subsect:value1,345.5);
	// get value1 from subsection subsect of section Main
	dval = ft.GetSection(Main)-GetSubSection(subsect)-GetValue(value1).AsDouble();
	// set 4th element of array array in section Main to 32.1
	ft.GetSection(Main)-SetArrayValue(array,4,32.1);
	// get 4th element of array array in section Main
	dval = ft.GetSection(Main)-GetValue(array).AsArray()[4].AsDouble();
	// iterate over all sections in file
	for (INI::File::sections_iter it = ft.SectionsBegin(); it != ft.SectionsEnd(); ++it)
	{
		std::cout  Section name:   it-first  std::endl;
		INI::Section* sect = it-second;
		// iterate over all entries in specific section
		for (INI::Section::values_iter it2 = sect-ValuesBegin(); it2 != sect-ValuesEnd(); ++it2)
			std::cout  Entry name:   it2-first  , Entry value:  
					   it2-second.AsString()  std::endl;
	}
	// output to INI file
	ft.Save(settings.ini);
	// output to stream
	std::cout  ft;
}

查看提供的test_app.cpp了解更多使用Leksys IniParser的示例,例如如何获取和设置注释、如何使用映射以及如何保存和加载类。

Ini语法支持

支持带有注释、多行、数组、映射、子部分和包含的扩展ini文件语法。格式如下:

; Comment line
; File inclusion. Absolute or relative path can be used
;#include settings2.ini
; simple line
global_int = 1
; multiline
global_str = Hello! This is just a sample string \
             That is multiline \
             Simple as that

; Section
[Main]
int      = 1                                 ; Integer value
double   = 2.303                             ; Double value
str      = Hello! This is string!            ; String
bool     = true                              ; Boolean value
array    = 1, 202.56, String with space, 5   ; Array
cmp_arr  = {12,3}, {13,5}, {18,9}            ; Array of arrays
cmp_arr2 = a, b, {, String with ,}           ; Array with string, cont. separator
cmp_arr3 = a, b, /, String with /,           ; Same as array cmp_arr2
cmp_arr3 = a, b, String with /{ and /}       ; Array with string, cont. braces
map      = 1:5, 1:3, 2:9, 3:10               ; Map
cmp_map  = a:{1,5,7}, b: {str1, {2,3}}       ; Complex map with arrays as values
cmp_map2 = a:{String with ,,}, b: String     ; Map with string, cont. separator
cmp_map3 = a:String with /,/,, b: String     ; Same as cmp_map2
cmp_map3 = a:String with /{ and /}, b: Str   ; Map with string, cont. braces

; Subsection (Sub1 is considered subsection of section Main)
[Main.Sub1]
ret      = String
ret2     = 201

[Main.Sub2]
; File contents of included file will be placed here
;#include settings/sub2.ini

运行测试ini读写

Leksys’ INI Parser项目提供了测试程序,编译使用cmake,所以编译前需要在环境中安装cmake,参照:http://www.cmake.org/cmake/resources/software.html 进行安装。

Linux中编译和运行

在Linux中,克隆代码到本地,并执行编译:

$ git clone https://github.com/Lek-sys/LeksysINI.git
$ cd LeksysINI
$ mkdir build
$ cd build
$ cmake ../
$ make

执行编译之后,就正常生成了可执行文件test_ini_app,执行即可完成ini文件读写的测试,运行如下:

$ ./test_ini_app -o test.ini

运行结果:

Leksys INIParser test program
Usage: test_app [-i input_file] [-o output_file]
Pass [input_file] for optional loading file test (TEST11)
Pass [output_file] for optional saving file test (TEST12)
---------------------------------------------------------
[TEST1] passed
[TEST2] passed
[TEST3] passed
[TEST4] passed
[TEST5] passed
[TEST6] passed
[TEST7] passed
[TEST8] passed
[TEST9] passed
[TEST10] passed
[TEST11] passed
[TEST12] passed
Optional [TEST13] (file loading) SKIPPED
[TEST14] passed! (Look in test.ini for your file)!
!!! [SUCCESS] !!!

输出到test.ini文件中的内容如下:

[MainProg]
value1 = 456
value2_0 = false
value2_1 = true
value2_2 = 0
value2_3 = 1
value2_4 = FALSE
value2_5 = TRUE
value2_6 = false
value2_7 = true
value3 = true,105,200.55000000000001,String,,,700.66999999999996 ;Test array
value_test = 1 ;Testing value

[MainProg2]
cmp_array1 = {12,3}, {13,5}, {18,9}
cmp_array2 = Str1, Str2, {{Str3,,3}}, Str4\,\,\{\,\,\}, {Str5\,,\{\{}
map1 = 1:5, 1:3, 2:9, 3:10
map2 = Str1:5, Str2:3, Str3:{:,,:}
map3 = Str1:{Sub1,{\,,\\{\\{Sub2,},{,:Sub3}}, Str2:1
value1 = 1 ;Comment 2
value_test = 1 ;Testing value

[MainProg2.Sub1]
test_val = {1,120.55500000000001,3} ;User-defined class

[MainProg2.Sub1.SubSub1]
value1 = 120

Windows中编译和运行

Windows中可以用cmake的gui进行编译,也可以输入一下命令:

$ mkdir build; cd build
$ cmake this_file_dir
$ %VS140COMNTOOLS%\vsvars32.bat
$ nmake

站心网

前言 Ini文件在Windows上可以使用GetPrivateProfileString系列函数,在Linux中也有多种可以选择的ini文件解..

为您推荐

一站式搭建交友平台-交友系统源码-支持H5小程序+带安装说明+可封装APP-交友网站系统平台搭建

诺诺婚恋交友系统1、系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。2、系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP;3、准备了完善的后台管理,..

Lynx:字节跳动开源的高性能跨平台 UI 框架

字节跳动近期宣布开源其自研的跨平台 UI 框架 Lynx,该框架已在 TikTok 等应用中广泛使用,旨在帮助 Web 开发者利用现有技能,通过一套代码同时构建移动端原生界面与 Web 端界面。Lynx 官网:https://lynxjs.org/Lyn..

GitHub爆款开源 AI 股票量化交易工具推荐

GitHub上有很多开源项目如 VeighNa(原 vn.py)、Abu量化 、RD-Agent 等提供了丰富的功能,包括多市场支持、策略回测和实盘交易接口,降低了量化交易的入门门槛。本文将为大家介绍几款GitHub上的爆款量化神器,希望..

TikTok美区收购案“生变”?风口浪尖下平台推进Plan B,卖家突围求生

尽管 TikTok 在美国的商业版图正高速扩张,但随着中美博弈持续升温,其在美的生存轨迹和发展预期也不可避免地受到影响。据路透社报道,白宫内部知情人士透露,由于特朗普对中国加征关税,以及字节跳动在数据主权、算..

代码照进现实:对公司管理策略的技术性解构

上学的时候觉得计算机专业的一些理论晦涩难懂,跟现实世界的关联太少,每当遇到一些精妙的设计时都会发出一种感叹:究竟是什么脑袋才能想出这么有意思的东西。一晃工作十年,阅历渐丰,隐约发现其实社会中的一些现象..

编写优秀 CSS 代码的 8 个策略

编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一。然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性。我认为这主要是因为许多开发人员对组织CSS / HTML和JavaScript的策..

天天写业务代码,如何成为技术大牛?

不管是开发、测试、运维,每个技术人员心理多多少少都有一个成为技术大牛的梦,毕竟"梦想总是要有的,万一实现了呢"!正是对技术梦的追求,促使我们不断地努力和提升自己。然而"梦想是美好的,现实却是残酷的",很多..

记我经历的一次公司破产经历,一行代码害死一家公司

前言这是一篇亲身经历的真实记录,事情发生在2010年。狗血剧情一再上演,使我的程序员生涯变得跌宕起伏,也从中学到了很多。在写这篇文章之前,我还专门去查了这家公司的资料。有如下事实:1.官网已经打不开了。2.天..

如何处理前任程序员留下的代码

作为软件工程师不可避免会遇到的一个场景是:我们在改变或添加一个功能到不是我们创建的、我们不熟悉的、与我们负责的系统部分无关的代码中时,会遇到麻烦。虽然这可能会是一个繁琐而艰巨的任务,但是由于使用其他开..

对码农而言什么样的代码才能叫做好代码?

好的代码,就像是好的笑话——无需解释就能让别人明白。如果你的代码能够做到不解自明,在大多数时候,你根本无需为其配备说明文档。好的代码,就像是一辆配备了优秀音响和杯架的汽车,这辆车在行驶到最高速度的时候..

成功运作一个开源项目的 15 个要点

运作开源项目很容易。所有你需要做的就是让你的源代码可用和开源,对吧?嗯,也许。其实,开源项目是否成功取决于你对项目成功的定义。且不论你是怎么定义的,创建开源项目需要大量的工作。如果你已经有了目标,那么..

当一个程序员写不出代码了,该怎么办?

你已经对着电脑n个小时了。不知道该写什么代码,或者一种摔键盘的冲动正在你的胸中酝酿。咖啡一杯接着一杯。不敢再喝了,因为搞不好要有副作用了,心跳加速,身体不由自主地颤抖,出冷汗,但还是无法产出任何代码。..

NETworkManager 一个基于.NET的开源网络管理和问题排查工具

NETworkManager 是一个基于.NET开源(GPL-3.0 license)、免费、功能强大的开源工具,旨在帮助用户管理和解决网络问题。通过提供一系列网络连接和管理工具,NETworkManager 能够让用户轻松连接到远程系统,管理网络..

.NET 主程序的.dll.config文件有什么用?

.dll.config 文件通常是在开发过程中自动生成的,它的主要作用是为某个类库(.dll 文件)提供一个独立的配置文件,以便开发者可以为该类库单独定义或测试配置项。以下是生成 .dll.config 文件的原因和机制:1. 配置..

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.文档地址:https://liningit.github.io/LnskyDB/开源地址:https://github.com/liningit/Ln..

BotSharp 基于 .NET 平台的开源 AI 聊天机器人框架

BotSharp 是一个开源的、基于 .NET 平台的 AI 聊天机器人框架,旨在简化构建智能对话系统的过程。它主要通过自然语言处理(NLP)技术,帮助开发者构建具备语言理解和对话能力的应用。BotSharp 提供了丰富的功能和扩..

.NET C#连接FTP实现文件上传下载

在 .NET 中可以使用 System.Net.FtpWebRequest 类来连接 FTP 服务器,实现文件上传和下载。以下是实现文件上传和下载的完整代码示例。1. 上传文件到 FTP 服务器using System;using System.IO;using System.Net;class..

.net 通过 HttpClient 下载文件同时报告进度的方法

通过 HttpClient 的 ContentLength 很多时候都可以拿到下载的内容的长度,通过 ReadAsync 可以返回当前读到的长度,将读取到的长度加起来就是已经下载的长度看起来很简单,于是直接给代码private static async Task ..

小米开源智能家居平台 ha_xiaomi_home 使用示例

小米近期在 GitHub 上开源了名为“ha_xiaomi_home”的项目,即 Home Assistant 米家集成组件。该组件由小米官方支持,旨在让用户在 Home Assistant 中集成和控制小米 IoT 智能设备。主要特点:官方支持:..

ASP.NET如何将Views文件夹从项目分离

将 Views 文件夹从 ASP.NET 项目中分离是一个常见需求,比如为了实现模块化或分层架构。以下是实现此功能的完整步骤,从项目中分离 Views 文件夹,将其移到另一个独立的文件夹或项目中,并确保视图渲染仍然正常。1. ..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制