C++教程(三):c++常用的配置文件类型
目录
1. INI 文件
2. JSON 文件
3. YAML 文件
4. XML 文件
5. TOML 文件
6. 二进制配置文件(Protocol Buffers, MessagePack, Avro 等)
总结
在 C++ 项目中,常用的配置文件类型有多种选择,具体选择取决于项目的复杂性、可读性要求、解析器的可用性以及跨平台的需求。常见的配置文件类型包括 INI、JSON、YAML、XML 、TOML、 Protocol Buffers(protobuf)、MessagePack和Avro 等。以下是这些配置文件类型的介绍、特点以及如何在 C++ 中使用它们。
1. INI 文件
1.1 概述
INI 文件是一种非常简单的配置文件格式,常用于存储应用程序的配置信息。它的结构由键值对和可选的节(section)组成,便于阅读和编写。
1.2 INI 文件示例
[General]
app_name = MyApp
version = 1.0[Database]
host = localhost
port = 5432
username = user
password = pass
1.3 在 C++ 中解析 INI 文件
C++ 中可以使用 inih 库来解析 INI 文件。
安装 inih:git clone https://github.com/benhoyt/inih
使用 inih 解析 INI 文件的示例代码:
#include "INIReader.h"
#include <iostream>int main() {INIReader reader("config.ini");if (reader.ParseError() < 0) {std::cout << "Can't load 'config.ini'\n";return 1;}std::string appName = reader.Get("General", "app_name", "UNKNOWN");std::string dbHost = reader.Get("Database", "host", "UNKNOWN");std::cout << "App Name: " << appName << std::endl;std::cout << "Database Host: " << dbHost << std::endl;return 0;
}
1.4 优点
简单易用:易于阅读和编写。
解析效率高:结构简单,解析速度快。
1.5 缺点
功能有限:不支持复杂的数据结构,如嵌套、数组等。
2. JSON 文件
2.1 概述
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,广泛用于配置文件和数据传输。它支持嵌套的对象、数组和基本数据类型。
2.2 JSON 文件示例
{"app_name": "MyApp","version": "1.0","database": {"host": "localhost","port": 5432,"username": "user","password": "pass"}
}
2.3 在 C++ 中解析 JSON 文件
C++ 中常用的 JSON 库包括 nlohmann/json 和 RapidJSON。
安装 nlohmann/json:sudo apt install nlohmann-json-dev
使用 nlohmann/json 解析 JSON 文件的示例代码:
#include <nlohmann/json.hpp>
#include <fstream>
#include <iostream>int main() {std::ifstream file("config.json");nlohmann::json config;file >> config;std::string appName = config["app_name"];std::string dbHost = config["database"]["host"];std::cout << "App Name: " << appName << std::endl;std::cout << "Database Host: " << dbHost << std::endl;return 0;
}
2.4 优点
支持复杂数据结构:如嵌套对象、数组等。
广泛使用:很多系统和语言都支持 JSON。
2.5 缺点
格式较冗长:相比 INI 文件,JSON 更加冗长,不如 INI 简单。
3. YAML 文件
3.1 概述
YAML(YAML Ain't Markup Language) 是一种人类可读的配置文件格式,支持多种数据类型,包括列表、字典、嵌套对象等。它比 JSON 更加简洁易读,特别适用于配置文件。
3.2 YAML 文件示例
app_name: MyApp
version: 1.0
database:host: localhostport: 5432username: userpassword: pass
3.3 在 C++ 中解析 YAML 文件
C++ 中常用的 YAML 解析库是 yaml-cpp。
安装 yaml-cpp:sudo apt install libyaml-cpp-dev
使用 yaml-cpp 解析 YAML 文件的示例代码:
#include <yaml-cpp/yaml.h>
#include <iostream>int main() {YAML::Node config = YAML::LoadFile("config.yaml");std::string appName = config["app_name"].as<std::string>();std::string dbHost = config["database"]["host"].as<std::string>();std::cout << "App Name: " << appName << std::endl;std::cout << "Database Host: " << dbHost << std::endl;return 0;
}
3.4 优点
简洁:比 JSON 更加简洁,易于书写。
支持复杂数据结构:和 JSON 一样,支持字典、列表和嵌套对象。
3.5 缺点
格式敏感:YAML 对缩进非常敏感,容易出错。
4. XML 文件
4.1 概述
XML(Extensible Markup Language) 是一种标记语言,常用于结构化数据的表示,尤其适合配置文件和文档数据。XML 具有很好的扩展性,支持复杂的数据结构,但较为冗长。
4.2 XML 文件示例
<config><app_name>MyApp</app_name><version>1.0</version><database><host>localhost</host><port>5432</port><username>user</username><password>pass</password></database>
</config>
4.3 在 C++ 中解析 XML 文件
C++ 中常用的 XML 解析库有 TinyXML2 和 libxml2。
安装 TinyXML2:sudo apt install libtinyxml2-dev
使用 TinyXML2 解析 XML 文件的示例代码:
#include <tinyxml2.h>
#include <iostream>int main() {tinyxml2::XMLDocument doc;doc.LoadFile("config.xml");tinyxml2::XMLElement* root = doc.FirstChildElement("config");const char* appName = root->FirstChildElement("app_name")->GetText();const char* dbHost = root->FirstChildElement("database")->FirstChildElement("host")->GetText();std::cout << "App Name: " << appName << std::endl;std::cout << "Database Host: " << dbHost << std::endl;return 0;
}
4.4 优点
自描述性强:适合数据交换和存储,支持丰富的标签和属性。
标准化:支持复杂的模式验证和结构化数据。
4.5 缺点
冗长:比 JSON 和 YAML 更加冗长,占用空间大。
解析速度较慢:相比于其他格式,解析效率较低。
5. TOML 文件
5.1 概述
TOML(Tom's Obvious, Minimal Language) 是一种简单易读的配置文件格式,设计目标是让配置文件既能轻松编辑,又能被解析为结构化数据。它的结构类似于 INI 文件,但支持更复杂的数据类型和嵌套结构。
5.2 TOML 文件示例
app_name = "MyApp"
version = "1.0"[database]
host = "localhost"
port = 5432
username = "user"
password = "pass"
5.3 在 C++ 中解析 TOML 文件
C++ 中常用的 TOML 解析库是 toml++。
安装 toml++:git clone https://github.com/marzer/tomlplusplus
使用 toml++ 解析 TOML 文件的示例代码:
#include <toml++/toml.h>
#include <iostream>int main() {auto config = toml::parse_file("config.toml");std::string appName = config["app_name"].value_or("Unknown");std::string dbHost = config["database"]["host"].value_or("Unknown");std::cout << "App Name: " << appName << std::endl;std::cout << "Database Host: " << dbHost << std::endl;return 0;
}
5.4 优点
简洁:比 JSON 更加简洁,语法更人性化。
支持复杂数据结构:像 YAML 和 JSON 一样,支持嵌套、列表等复杂结构。
5.5 缺点
较少使用:TOML 仍然相对较新,支持的工具和库不如 JSON、YAML 广泛。
6. 二进制配置文件(Protocol Buffers, MessagePack, Avro 等)
6.1 概述
对于需要高效传输和存储的场景,可以使用二进制格式来配置和序列化数据。常用的二进制配置格式包括 Protocol Buffers(protobuf)、MessagePack、Avro 等。这些格式更适合高性能、数据密集型应用,特别是在分布式系统或嵌入式系统中使用。下面以使用较多的protobuf文件举例说明。
6.2 protobuf文件示例
syntax = "proto3";message Person {int32 id = 1;string name = 2;string email = 3;
}
6.3 在 C++ 中解析Protocol Buffers 文件
安装 Protocol Buffers
sudo apt install protobuf-compiler
sudo apt install libprotobuf-dev
编译 .proto 文件生成 C++ 代码:protoc --cpp_out=. person.proto
#include "person.pb.h"
#include <fstream>
#include <iostream>int main() {Person person;person.set_id(123);person.set_name("Alice");person.set_email("alice@example.com");// 序列化到文件std::ofstream output("person.data", std::ios::binary);person.SerializeToOstream(&output);output.close();// 反序列化Person new_person;std::ifstream input("person.data", std::ios::binary);new_person.ParseFromIstream(&input);input.close();std::cout << "ID: " << new_person.id() << "\n"<< "Name: " << new_person.name() << "\n"<< "Email: " << new_person.email() << std::endl;
}
6.4 优点
高效:二进制格式比文本格式更加紧凑,传输效率高。
跨平台支持:这些格式有很好的多语言支持,适合跨平台、跨语言项目。
6.5 缺点
不可读:二进制格式不便于人类直接编辑和阅读,通常需要专门的工具或界面来修改。
总结
不同的配置文件格式在 C++ 项目中的应用各有优缺点,选择时应考虑以下因素:
INI 文件:简单,适用于小型项目和配置需求较少的应用。
JSON 文件:灵活,适用于需要复杂数据结构的项目。
YAML 文件:简洁易读,适用于配置文件较多、易读性要求高的项目。
XML 文件:功能强大,适用于需要复杂描述和自描述性的场景。
TOML 文件:简洁且支持复杂数据,适合需要人类友好且功能强大的配置场景。
二进制配置文件:适合高效、紧凑存储和传输需求的场景。
相关文章:
C++教程(三):c++常用的配置文件类型
目录 1. INI 文件 2. JSON 文件 3. YAML 文件 4. XML 文件 5. TOML 文件 6. 二进制配置文件(Protocol Buffers, MessagePack, Avro 等) 总结 在 C 项目中,常用的配置文件类型有多种选择,具体选择取决于项目的复杂性、可读性…...
Arduino Uno控制雨滴传感器模块的设计方案
以下是Arduino Uno控制雨滴传感器模块的设计方案: 一、硬件准备: 1. Arduino Uno 开发板一块。 2. 雨滴传感器模块一个。 3. 杜邦线若干。 4. 9V直流电源一个。 二、硬件连接: 1. 将Arduino Uno板的Vin引脚、GND引脚分别连接到9V直流电…...
华为常见命令手册
常见命令 display ip interface brief —> 查看设备上的每个接口的IP地址【地址/掩码/状态】 display interface gi0/0/0 → 查看该接口的MAC 地址 ipconfig → 查看 PC 上面的 IP地址 display arp → 查看设备的 ARP 表 arp -a → 查看 PC 上面的 ARP 表 display m…...

TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点
论文标题: 英文:TinyAP: An intelligent Access Point to combat Wi-Fi attacks using TinyML中文:TinyAP:使用TinyML对抗Wi-Fi攻击的智能接入点 作者信息: Anand Agrawal 和 Rajib Ranjan Maiti,来自印…...

grafana频繁DataSourceError问题
背景 随着 Grafana 数据量的不断增加,逐渐暴露出以下问题: Grafana 页面加载缓慢;Grafana 告警频繁出现 DatasourceError 错误。 对于第一个问题,大家可以参考这篇文章:Grafana 加载缓慢的解决方案。 不过…...

python-ds:Python 中的数据结构库(适用于面试的数据结构和算法合集)
在软件开发中,数据结构是组织和存储数据的方式,对算法的效率和程序的性能至关重要。Python 提供了许多内置的数据结构,但在一些复杂的应用场景中,原生数据结构可能无法满足特定需求。这时,一个功能强大、易于使用的数据…...
AccessoriesqueryController
目录 1、 AccessoriesqueryController 1.1、 库存配件查询 1.2、 查询仓库 1.2.1、 //把数据库数据加到表格:跟默认然一行数据进行合并 1.3、 /// 查询 1.3.1、 配件编码查询 1.3.2、 配件名称查询 1.3.3、 配件类型查询 AccessoriesqueryControlle…...

M3u8视频由手机拷贝到电脑之后,通过potplayer播放报错找不到文件地址怎么解决?
该文章前面三节主要介绍M3u8视频是什么,视频播放错误(找不到地址)的解决方法在后面 M3U8是一种多媒体播放列表文件格式,主要用于流媒体播放。 一、文件格式特点 1. 文本文件:M3U8是一个采用 UTF-8 编码的文本文件,这意味着它可…...

【分布式微服务云原生】windows+docker+mysql5.7.44一主一从主从复制
目录 1. 主库设置2. 从库设置3. 验证主从复制内容汇总表格 摘要: 在Windows系统上通过Docker部署MySQL主从复制,以下是详细的步骤和命令,帮助你设置一主一从的MySQL复制环境。 1. 主库设置 步骤1:运行MySQL主库容器 docker run …...
鸿蒙NEXT开发-界面渲染(条件和循环)(基于最新api12稳定版)
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

TypeScript 设计模式之【状态模式】
文章目录 状态模式:优雅切换的交通信号灯状态模式的奥秘状态模式有什么利与弊?如何使用状态模式来优化你的系统代码实现案例状态模式的主要优点状态模式的主要缺点状态模式的适用场景总结 状态模式:优雅切换的交通信号灯 当你站在繁忙的十字路口&#…...
MongoDB 聚合管道
参考: 聚合管道 - MongoDB 手册 v7.0 介绍 聚合管道由一个或多个处理文档的阶段组成: 每个阶段对输入文档执行一个操作。例如,某个阶段可以过滤文档、对文档进行分组并计算值。 从一个阶段输出的文档将传递到下一阶段。 一个聚合管道可以返回针对文档…...

python-patterns:Python 设计模式大全
python-patterns 是一个开源的 Python 项目,它提供了各种经典的设计模式的 Python 实现。设计模式是一种针对常见软件设计问题的可复用解决方案,通过使用设计模式,开发者可以编写出结构更加合理、易于维护和扩展的代码。 Python 是一门动态语…...
Nginx编译所需基本库pcre、zlib、openssl
一、基本库介绍 pcre:(Perl Compatible Regular Expressions) 是一个用 C 语言编写的正则表达式库,用于进行文本匹配和搜索。它提供了与 Perl 正则表达式兼容的功能,并且广泛用于许多不同的软件项目中,如网…...
C#进阶:探索嵌套类、匿名类及对象初始化器的强大运用
在C#中,嵌套类、匿名类以及对象初始化器是几种强大的特性,它们可以极大地提高代码的可读性和灵活性。下面分别介绍这些特性的运用。 1. 嵌套类 嵌套类是指定义在另一个类内部的类。内部类可以访问其外围类的所有成员(包括私有成员ÿ…...
匈牙利算法模板
P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:最模板的一集.还未匹配则匹配,否则之前一个给现在这个让位置. int n,m,e; vector<int> vct[505]; int match[505]; bool vis[505]; bool mark[505][505]; bool dfs(int s)…...

ubuntu 安装harbor
#安装包 wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz wget https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz.asc#导入签名公钥 gpg --keyserver hkps://ke…...
Python/大数据/机器识别毕业设计选题题目推荐
基于Python和Diango在线购物商城系统报告文档指导搭建视频 基于深度学习的人脸识别与管理系统,Python实现 基于Python/机器学习链家网新房数据可视化及预测系统 Python豆瓣电影情感分析推荐系统爬虫可视化,过滤算法 基于python的django框架生鲜商城管…...
基于Python的人工智能应用案例系列(17):LSTM正弦波预测
概述 本案例展示了如何使用LSTM(长短期记忆网络)来预测正弦波序列的未来值。由于正弦波具有周期性,传统的神经网络难以准确预测其上升或下降趋势,而LSTM则能够通过学习值的模式来进行更精准的预测。本案例将训练LSTM模型并预测正弦…...

Python空间地表联动贝叶斯地震风险计算模型
🎯要点 使用贝叶斯推断模型兼顾路径和场地效应,量化传统地理统计曲线拟合技术。使用破裂和场地特征等地质信息以及事件间残差和事件内残差描述数学模型模型使用欧几里得距离度量、角距离度量和土壤差异性度量确定贝叶斯先验分布和后验分布参数ÿ…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...