当前位置: 首页 > news >正文

C++教程(三):c++常用的配置文件类型

目录

1. INI 文件

2. JSON 文件

3. YAML 文件

4. XML 文件

5. TOML 文件

6. 二进制配置文件(Protocol Buffers, MessagePack, Avro 等)

总结


在 C++ 项目中,常用的配置文件类型有多种选择,具体选择取决于项目的复杂性、可读性要求、解析器的可用性以及跨平台的需求。常见的配置文件类型包括 INIJSONYAMLXMLTOML、 Protocol Buffers(protobuf)、MessagePackAvro  等。以下是这些配置文件类型的介绍、特点以及如何在 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. 二进制配置文件&#xff08;Protocol Buffers, MessagePack, Avro 等&#xff09; 总结 在 C 项目中&#xff0c;常用的配置文件类型有多种选择&#xff0c;具体选择取决于项目的复杂性、可读性…...

Arduino Uno控制雨滴传感器模块的设计方案

以下是Arduino Uno控制雨滴传感器模块的设计方案&#xff1a; 一、硬件准备&#xff1a; 1. Arduino Uno 开发板一块。 2. 雨滴传感器模块一个。 3. 杜邦线若干。 4. 9V直流电源一个。 二、硬件连接&#xff1a; 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攻击的智能接入点

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

grafana频繁DataSourceError问题

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

python-ds:Python 中的数据结构库(适用于面试的数据结构和算法合集)

在软件开发中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;对算法的效率和程序的性能至关重要。Python 提供了许多内置的数据结构&#xff0c;但在一些复杂的应用场景中&#xff0c;原生数据结构可能无法满足特定需求。这时&#xff0c;一个功能强大、易于使用的数据…...

AccessoriesqueryController

目录 1、 AccessoriesqueryController 1.1、 库存配件查询 1.2、 查询仓库 1.2.1、 //把数据库数据加到表格&#xff1a;跟默认然一行数据进行合并 1.3、 /// 查询 1.3.1、 配件编码查询 1.3.2、 配件名称查询 1.3.3、 配件类型查询 AccessoriesqueryControlle…...

M3u8视频由手机拷贝到电脑之后,通过potplayer播放报错找不到文件地址怎么解决?

该文章前面三节主要介绍M3u8视频是什么&#xff0c;视频播放错误(找不到地址)的解决方法在后面 M3U8是一种多媒体播放列表文件格式&#xff0c;主要用于流媒体播放。 一、文件格式特点 1. 文本文件&#xff1a;M3U8是一个采用 UTF-8 编码的文本文件&#xff0c;这意味着它可…...

【分布式微服务云原生】windows+docker+mysql5.7.44一主一从主从复制

目录 1. 主库设置2. 从库设置3. 验证主从复制内容汇总表格 摘要&#xff1a; 在Windows系统上通过Docker部署MySQL主从复制&#xff0c;以下是详细的步骤和命令&#xff0c;帮助你设置一主一从的MySQL复制环境。 1. 主库设置 步骤1&#xff1a;运行MySQL主库容器 docker run …...

鸿蒙NEXT开发-界面渲染(条件和循环)(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

TypeScript 设计模式之【状态模式】

文章目录 状态模式&#xff1a;优雅切换的交通信号灯状态模式的奥秘状态模式有什么利与弊?如何使用状态模式来优化你的系统代码实现案例状态模式的主要优点状态模式的主要缺点状态模式的适用场景总结 状态模式&#xff1a;优雅切换的交通信号灯 当你站在繁忙的十字路口&#…...

MongoDB 聚合管道

参考: 聚合管道 - MongoDB 手册 v7.0 介绍 聚合管道由一个或多个处理文档的阶段组成&#xff1a; 每个阶段对输入文档执行一个操作。例如&#xff0c;某个阶段可以过滤文档、对文档进行分组并计算值。 从一个阶段输出的文档将传递到下一阶段。 一个聚合管道可以返回针对文档…...

python-patterns:Python 设计模式大全

python-patterns 是一个开源的 Python 项目&#xff0c;它提供了各种经典的设计模式的 Python 实现。设计模式是一种针对常见软件设计问题的可复用解决方案&#xff0c;通过使用设计模式&#xff0c;开发者可以编写出结构更加合理、易于维护和扩展的代码。 Python 是一门动态语…...

Nginx编译所需基本库pcre、zlib、openssl

一、基本库介绍 pcre&#xff1a;&#xff08;Perl Compatible Regular Expressions&#xff09; 是一个用 C 语言编写的正则表达式库&#xff0c;用于进行文本匹配和搜索。它提供了与 Perl 正则表达式兼容的功能&#xff0c;并且广泛用于许多不同的软件项目中&#xff0c;如网…...

C#进阶:探索嵌套类、匿名类及对象初始化器的强大运用

在C#中&#xff0c;嵌套类、匿名类以及对象初始化器是几种强大的特性&#xff0c;它们可以极大地提高代码的可读性和灵活性。下面分别介绍这些特性的运用。 1. 嵌套类 嵌套类是指定义在另一个类内部的类。内部类可以访问其外围类的所有成员&#xff08;包括私有成员&#xff…...

匈牙利算法模板

P3386 【模板】二分图最大匹配 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路:最模板的一集.还未匹配则匹配&#xff0c;否则之前一个给现在这个让位置. 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在线购物商城系统报告文档指导搭建视频 基于深度学习的人脸识别与管理系统&#xff0c;Python实现 基于Python/机器学习链家网新房数据可视化及预测系统 Python豆瓣电影情感分析推荐系统爬虫可视化&#xff0c;过滤算法 基于python的django框架生鲜商城管…...

基于Python的人工智能应用案例系列(17):LSTM正弦波预测

概述 本案例展示了如何使用LSTM&#xff08;长短期记忆网络&#xff09;来预测正弦波序列的未来值。由于正弦波具有周期性&#xff0c;传统的神经网络难以准确预测其上升或下降趋势&#xff0c;而LSTM则能够通过学习值的模式来进行更精准的预测。本案例将训练LSTM模型并预测正弦…...

Python空间地表联动贝叶斯地震风险计算模型

&#x1f3af;要点 使用贝叶斯推断模型兼顾路径和场地效应&#xff0c;量化传统地理统计曲线拟合技术。使用破裂和场地特征等地质信息以及事件间残差和事件内残差描述数学模型模型使用欧几里得距离度量、角距离度量和土壤差异性度量确定贝叶斯先验分布和后验分布参数&#xff…...

虚幻引擎-设置UI自适应屏幕大小

在游戏中&#xff0c;如果想实现不同分辨率下&#xff0c;都可以支持当前的UI界面布局&#xff0c;都需要用到锚点功能。 ‌虚幻引擎中的UI锚点&#xff08;Anchor&#xff09;是指控件在屏幕或父物体上的固定点&#xff0c;用于确定控件的位置和布局。‌ 锚点的作用是确保UI元…...

C++继承的三种方式[ACCESS]

C继承的定义 两个类的继承关系在派生类中声明&#xff0c;派生类定义使用以下语法&#xff1a; class DerivedClass: [ACCESS] BaseClass{ /…/ }; 冒号&#xff08;:&#xff09;后的[ACCESS]是继承的最高权限级别符&#xff0c;可以是以下三个值&#xff08;存取权限级别&am…...

idea 同一个项目不同模块如何设置不同的jdk版本

在IntelliJ IDEA中&#xff0c;可以为同一个项目中的不同模块设置不同的JDK版本。这样做可以让你在同一个项目中同时使用多个Java版本&#xff0c;这对于需要兼容多个Java版本的开发非常有用。以下是设置步骤&#xff1a; 打开项目设置&#xff1a; 在IDEA中&#xff0c;打开你…...

1-仙灵之谜(区块链游戏详情介绍)

1-仙灵之谜&#xff08;区块链游戏详情介绍&#xff09; 前言&#xff08;该游戏仅供娱乐&#xff09;正文 前言&#xff08;该游戏仅供娱乐&#xff09; 依稀记得本科那会儿参加了一个区块链实验室&#xff0c;那时每周末大家都会爬山或者抽出一下午讨论区块链以及未来&#x…...

基于51单片机的温湿度上下限监测预警proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1hSprWBYhKKx8Txzaj33YPA?pwdjp3d 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMic…...

考核总结.

事件循环 单线程的js在处理异步事件时进行的一种循环过程。 在 JS中任务分为同步与异步任务&#xff0c;其中异步任务又分为两种&#xff1a;宏任务和 微任务。宏任务和微任务的执行顺序&#xff1a;总方针是先同步再异步&#xff0c;异步中先微任务&#xff0c;在宏任务。一次…...

后端学习路线

后端学习路线 一、编程语言 至少需要学习一门编程语言&#xff0c;建议学习JAVA和GO语言。 二、数据库 数据库分为关系型数据库和非关系型数据库&#xff0c;区别在于分关系型数据库常用于大数据&#xff0c;而非关系型数据库一般不在大数据方面使用。 关系型数据库&#x…...

车辆重识别(注意力 U-Net:学习在哪些区域寻找胰腺)论文阅读2024/10/01

什么是注意力机制&#xff1f; 什么是加性注意力&#xff1f; 大致说一下流程&#xff1a; 对于一张特征图来说&#xff0c;对于这张图中的每一个像素向量&#xff08;例如a&#xff09;&#xff0c;计算该向量与所有像素向量的相似度&#xff0c;对这些相似度进行激活函数…...

【区别】git restore --staged <文件> 和 git reset HEAD <文件> 都可以用于取消已暂存的文件

git restore --staged <文件> 和 git reset HEAD <文件> 都可以用于取消已暂存的文件&#xff0c;但它们的工作原理和适用场景有所不同。以下是对这两个命令的详细比较&#xff1a; 1. 命令概述 git restore --staged <文件>&#xff1a; 专门用于将指定文件…...

void类型

编程语言中的void类型是一种特殊的数据类型&#xff0c;它表示不存在任何值。void, 无或者空类型。大部分编程语言支持void, 用做函数无返回值类型。最早ALGOL 68引入void类型。 void的特别使用 经典C缺乏void类型&#xff0c;函数可以不指定返回值&#xff0c;默认是整型int.…...

网站如何设置二级域名/深圳外贸网络推广渠道

文章目录一、先说思路二、示例代码一、先说思路 1、使用cross-env修改系统常量&#xff0c;使程序知道接下来的操作要想那个服务器自动部署 2、使用ssh2操作服务器&#xff0c;将服务器上原有的项目改名&#xff0c;并放入记录文件夹 3、使用scp2将打包后的文件发送到对应的服…...

北京做网站建设的公司/旺道网站排名优化

get命令 一、语法 get [-E] [-a] [-c] [-O base] rfile [-o lfile] 选项 说明 -o 指定输出文件的名字&#xff0c;不指定则使用原来的名字 -c 如果失败&#xff0c;持续获取 -E 获取之后&#xff0c;删除源文件 -a 使用ascii模式 -O 指定输出文件存放的目录 二…...

外贸自建站如何收款/网站优化要做哪些

保存照片和视频到系统相册显示- http://blog.csdn.net/chendong_/article/details/52290329 Android 7.0 之拍照与图片裁剪适配-http://blog.csdn.net/yyh352091626/article/details/54908624 拍照、相册及裁剪的终极实现&#xff08;一&#xff09;——拍照及裁剪功能实现- ht…...

学网站开发/营销型网站建设总结

大带宽服务器的优势肯定是普通服务器所比不上的。从以下几点说明一下。 一、体验更好 大带宽服务器租用&#xff0c;意味着你的网站可以承受更高的流量&#xff0c;在带宽越大的情况下&#xff0c;能够同时支持的在线用户越多&#xff0c;也不会带来卡顿。此时用户的缓存页面&a…...

郑州做音响网站的公司/郑州网络运营培训

Modbus在串行链路上分为Slave和Master&#xff0c;这一节我们就来开发Slave。对于Modbus RTU从站来说&#xff0c;需要实现的功能其实与Modbus TCP的服务器端是一样的。其操作过程也是一样的。首先接收到主站的访问命令&#xff0c;对该命令报文进行解析&#xff0c;这里我们也…...

wordpress 删除表/国产搜什么关键词最好看

本来8号可以过来的&#xff0c;结果because 家home事&#xff0c;不得已晚来了三天。全当报知遇之恩&#xff0c;一天顶一年的了。三年后&#xff0c;再说。三年死合同。 MySQL数据库基础学习&#xff0c; 之前work 用的SqlServer&#xff0c;new company 用的MySQL&#xff0…...