基于C++的配置文件解析器/编码器——toml库

news2024/11/15 13:41:38

  在平常的软件开发过程中,配置文件是重要的一环,使用配置文件在软件开发过程中具有以下好处和必要性:

  • 灵活性:配置文件允许在不修改代码的情况下更改应用程序的行为,通过修改配置文件,可以调整应用程序的参数、设置和选项,以满足不同的需求和环境。
  • 可维护性:将配置信息从代码中分离出来,使得维护和管理变得更加容易,当需要修改配置时,只需修改配置文件,而不需要重新编译和部署整个应用程序。
  • 可扩展性:配置文件可以用于支持应用程序的扩展。通过添加新的配置项,可以轻松地引入新的功能或模块,而无需修改现有的代码。
  • 跨环境部署:使用配置文件可以轻松地在不同的环境中部署应用程序,例如开发、测试和生产环境,通过切换不同的配置文件,可以适应不同环境的需求。
    总之,配置文件在软件开发中起到了关键的作用,它们提供了一种灵活、可维护和可扩展的方式来管理应用程序的行为和设置。

  虽然写配置文件本身是一个简单的事情,但很容易出错,且容易因为规范不一导致解析出错,自从使用了TOML库,发现是真香!
在这里插入图片描述

1.关于toml

  toml11是一个C++的库,用于解析和生成 TOML(Tom’s Obvious, Minimal Language)格式的配置文件。TOML是一种易于阅读和编写的配置文件格式,被广泛用于各种应用程序的配置文件中。主要作用是提供了一种简单、高效的方式来读取和写入TOML格式的配置文件。

源码:
https://github.com/marzer/tomlplusplus
https://github.com/ToruNiina/toml11

https://gitee.com/boss-dog/tomlplusplus
https://gitee.com/boss-dog/toml11

  toml11和tomlplusplus都是C++的库,用于解析和生成TOML格式的配置文件。
  toml11是一个轻量级的TOML库,可以直接包含在项目中使用,无需额外的依赖,代码量较小,功能相对较少,但足以满足大多数简单的TOML文件解析和生成需求。
  tomlplusplus是一个更为全面和功能丰富的TOML库,它是基于toml11的基础上进行扩展和改进的,支持更多的TOML语法特性,提供了更灵活的配置选项和更强大的错误处理机制。
  总的来说,toml11适用于简单的TOML文件解析和生成需求,它轻量、易用、快速。而tomlplusplus则适用于更复杂的TOML文件操作,提供了更多的功能和选项,并具有更好的性能。选择使用哪个库取决于具体的需求和项目的规模。

1.1 安装toml

  • 1.从toml11的仓库下载源代码
git clone https://gitee.com/boss-dog/toml11.git
  • 2.将下载的源代码放置在项目目录中的合适位置。

  • 3.在CMakeLists.txt文件中添加以下内容,以引入toml11库:

# 设置toml11库的路径
set(TOML11_INCLUDE_DIR /path/to/toml11)

# 添加toml11库的头文件路径
include_directories(${TOML11_INCLUDE_DIR})

# 添加toml11库的源文件
add_library(toml11 INTERFACE)
target_include_directories(toml11 INTERFACE ${TOML11_INCLUDE_DIR})

请确保将/path/to/toml11替换为实际的toml11库的路径。

  • 在项目中可以使用#include "toml.hpp"来包含toml11库的头文件,并使用toml::前缀来访问toml11库的功能

2.示例:使用toml库编写对配置文件的解析

dog_roster.conf

num_dog = 3
version = '1.1.2'

[[Zhou]]
name = 'BuDing'
adopted = true
age = 4
weight = 15.6
height = 30.0

    [Zhou.options]
    pose = [0.1,0.2,0.3]


[[Zhou]]
name = 'DuoDuo'
adopted = true
age = 3.5
weight = 15.6
height = 29.8

    [Zhou.options]
    pose = [1.1,1.2,1.3]

[[Zhou]]
name = 'PaoPao'
adopted = false
age = 6
weight = 28.2
height = 50.1

    [Zhou.options]
    pose = [0.01,0.02,0.03]

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(MyDemo)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)

# 设置toml11库的路径
set(TOML11_INCLUDE_DIR toml11)

# 添加toml11库的头文件路径
include_directories(${TOML11_INCLUDE_DIR})

# 添加可执行文件
add_executable(test_toml
    test_toml.cpp
)

# 添加toml11库的源文件
add_library(toml11 INTERFACE)
target_include_directories(test_toml INTERFACE ${TOML11_INCLUDE_DIR})

test_toml.cpp

#include <iostream>
#include "toml.hpp"

int main()
{
    // 解析配置文件
    std::ifstream config_file("../dog_roster.conf");

    if (!config_file.is_open()) {
        std::cerr << "Failed to open config file!" << std::endl;
        return -1;
    }
    const auto data = toml::parse(config_file);

    // 获取num_dog和version的值
    const int num_dog = toml::find<int>(data, "num_dog");
    const std::string version = toml::find<std::string>(data, "version");

    std::cout << "num_dog: " << num_dog << std::endl;
    std::cout << "version: " << version << std::endl;

    try {
        // 遍历每个狗的信息
        const auto &dogs = toml::find(data, "Zhou");
        for (const auto &dog : dogs.as_array()) {
            const std::string name = toml::find<std::string>(dog, "name");
            const bool adopted = toml::find<bool>(dog, "adopted");

            int age = -1;
            if (dog.at("age").is_integer()) {
                age = toml::find<int>(dog, "age");
            } else if (dog.at("age").is_floating()) {
                age = toml::find<double>(dog, "age");
            }

            const double weight = toml::find<double>(dog, "weight");
            const double height = toml::find<double>(dog, "height");

            std::cout << "name: " << name << std::endl;
            std::cout << "adopted: " << (adopted ? "true" : "false")
                      << std::endl;
            std::cout << "age: " << age << std::endl;
            std::cout << "weight: " << weight << std::endl;
            std::cout << "height: " << height << std::endl;

            // 获取pose选项的值
            const auto &options = toml::find(dog, "options");
            const auto pose = toml::find<std::vector<double>>(options, "pose");

            std::cout << "pose: [";
            for (const auto &p : pose) {
                std::cout << p << ", ";
            }
            std::cout << "]" << std::endl;
        }
    } catch (const toml::syntax_error &e) {
        std::cerr << "Syntax error in configuration file: " << e.what()
                  << std::endl;
    } catch (const std::exception &e) {
        std::cerr << "Error occurred: " << e.what() << std::endl;
    }

    std::cout << "Finished!" << std::endl;
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1502608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能合约语言(eDSL)—— proc_macro实现合约init函数

我们通过属性宏来实现合约的init函数&#xff0c;call函数其实和init是类似的&#xff1b; GitHub - XuHugo/xwasm 构建属性宏&#xff0c;要在cargo.toml里面设置一些参数&#xff0c;这是必须的。一般来说&#xff0c;过程宏必须是一个库&#xff0c;或者作为工程的子库&…

LabVIEW质谱仪开发与升级

LabVIEW质谱仪开发与升级 随着科技的发展和实验要求的提高&#xff0c;传统基于VB的质谱仪系统已经无法满足当前的高精度和高效率需求。这些系统通常存在着功能不全和操作复杂的问题&#xff0c;影响了科研和生产的进度。为了解决这些问题&#xff0c;开发了一套基于LabVIEW开…

【Web安全】htaccess攻击

.htaccess攻击 文章目录 .htaccess攻击1. .htaccess文件2. 常见用法2.1. 自定义出错界面2.2. 强制文件执行方式2.3. PCRE绕过正则匹配2.4. php_value修改php设定2.5. php_value文件包含2.6. 把htaccess当作php 1. .htaccess文件 .htaccess是Apache网络服务器一个配置文件&#…

MATLAB读取.nc(数据集)文件

MATLAB读取.nc(数据集)文件 以中国1km逐月潜在蒸散发数据集&#xff08;1901-2022&#xff09;为例 首先用FileZilla下载特定年份的数据集 用matlab进行处理&#xff0c;代码如下&#xff1a; clear;clc;ncdisp("pet_2022.nc") %读数据集的具体信息和变量eva ncr…

JAVA中YML:几个用法

项目有一些配置文件&#xff0c;ini、prop类型的配置文件都考虑过后&#xff0c;还是选择yml文件&#xff0c;如上图&#xff1a;xxconfig.yml。 要求&#xff1a; 1、允许实施人员手动配置 2、配置文件要能轻便的转化为一个JAVA对象 3、程序启动后&#xff0c;打印这些配置项&…

蓝桥省赛倒计时 35 天-线性 dp 练习

文章目录 数学三角形最长上升子序列 数学三角形 思路&#xff1a;就是下一层通过上一层的条件转移过来&#xff0c;注意数可以是负数&#xff0c;所以边界得取-INF&#xff0c;这样求上层 max 的时候不会被初始化的数如 0 影响。 #include<bits/stdc.h> using namespace…

【Qt】不透明指针(Opaque Pointer)在Qt源码中的应用

目录 什么是不透明指针&#xff08;Opaque Pointer&#xff09;不透明指针在Qt代码中的应用Qt中与不透明指针相关的一些宏 什么是不透明指针&#xff08;Opaque Pointer&#xff09; GeeksforGeeks中给的定义如下&#xff1a; An opaque pointer is a pointer that points to …

每日一题 — 和为t的两个数

LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 代码&#xff1a; public int[] twoSum(int[] price, int target) {int left 0;int right price.length - 1;while(left < right){//每一次都重新计算和int sum price[…

云上攻防-云原生篇K8s安全实战场景攻击Pod污点Taint横向移动容器逃逸

知识点 1、云原生-K8s安全-横向移动-污点Taint 2、云原生-K8s安全-Kubernetes实战场景 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&#xff0c;腾讯云&…

jeecgboot 新建子模块 使用@EXCEL实现实现导入导出功能

一&#xff0c;用框架生成增删改查模块 二&#xff0c;在实体类entity 需要导入导出的字段上加上注解Excel 三&#xff0c;在controller类上继承jeecgboot通用controller JeecgController 并且在JeecgController里增加导出模板的方法 /*** 导出excel空模板** param req…

蓝牙系列七:开源蓝牙协议栈BTStack数据处理

继续蓝牙系列的研究。 在上篇博客,通过阅读BTStack的源码,大体了解了其框架,对于任何一个BTStack的应用程序都有一个main函数,这个main函数是统一的。这个main函数做了某些初始化之后,最终会调用到应用程序提供的btstack_main,在btstack_main里面首先做一些初始化,然后…

【Python】成功解决AttributeError: ‘MyClass‘ object has no attribute ‘my_attribute‘

【Python】成功解决AttributeError: ‘MyClass’ object has no attribute ‘my_attribute’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门…

力扣算法34. 在排序数组中查找元素的第一个和最后一个位置

Python&Java双语解决力扣必刷算法&#xff0c;题号34. 在排序数组中查找元素的第一个和最后一个位置 目录 题目描述 解题思路 完整代码 Java Python 题目描述 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中…

windows下mysql8.3解压安装后临时密码报1045错误解决

过程&#xff1a; 1.登录MySQL官网www.mysql.com&#xff0c;进入产品下载页面。 2.选择MySQL Community&#xff08;GPL&#xff09;Downloads链接跳转下载页。 3.选择MySQL Community Server。 4.选择安装方式。通常有解压包安装和步骤安装两种方式&#xff0c;这里选择了解…

【硬件设计】(更新中)以 UCC27710 为例设计栅极驱动器元件选型(资料摘抄)

还没更新完。。。。。。。 【仅作自学记录&#xff0c;不出于任何商业目的。如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01;】 本文摘抄翻译自&#xff1a; Bootstrap Network Analysis: Focusing on the Integrated Bootstrap Functionality (infineon.com)Boo…

集群下锁失效的问题(JAVA)

一&#xff0c;出现问题的原因 因此每一个锁对象&#xff0c;都会指向一个锁监视器&#xff0c;而每一个锁监视器&#xff0c;同一时刻只能被一个线程持有&#xff0c;这样就实现了互斥效果。但前提是&#xff0c;多个线程使用的是同一把锁。 但问题来了&#xff0c;我们的服务…

Unity 让角色动起来(动画控制器)

下载素材&#xff1a; 导入后&#xff0c;找到预制体和动画。 新建动画控制器&#xff0c;拖动到预制体的新版动画组件上。 建立动画关系 创建脚本&#xff0c;挂载到预制体上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public c…

github Commits must have verified signatures

1.首先确认是否有权限&#xff0c;如有权限的情况下那就是配置有问题了 我的情况是&#xff0c;能拉取代码&#xff0c;提交的时候出现这种情况&#xff1a;Commits must have verified signatures 这里是生成证书&#xff0c;如果已经生成过的&#xff0c;就不用生成了 ssh…

勒索软件事件手册:综合指南

近年来&#xff0c;勒索软件攻击的频率和复杂程度都急剧增加。这些攻击的影响可能是毁灭性的&#xff0c;从经济损失到严重的运营中断。 这就是为什么对于希望防范这种网络安全威胁的企业来说&#xff0c; 强大的勒索软件事件响应手册是不可谈判的。 本指南旨在深入了解勒索软…

Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用

利用此方法&#xff0c;您可以在局域网&#xff08;尤其是NAS&#xff09;上搭建的Web应用支持公网访问&#xff0c;成本低而且操作简单&#xff01; 如果这是博客的话&#xff0c;它还可以有效防止DDOS攻击&#xff01; 准备工作&#xff1a; 需要一个域名&#xff08;推荐N…