新闻中心
C++如何读取配置文件(ini/json)?(方法与示例)
C++读取配置文件推荐使用inih解析INI和nlohmann/json解析JSON:inih轻量无依赖,适合扁平配置;nlohmann/json支持嵌套与结构体映射,适合复杂跨语言场景。

读取配置文件在C++中很常见,但标准库不直接支持INI或JSON格式,需要借助第三方库或手动解析。下面介绍两种主流方式:用 inih 读INI,用 nlohmann/json 读JSON,都是轻量、头文件仅需、无依赖的推荐方案。
用 inih 读取 INI 文件
inih(INI Not Invented Here)是一个极简的C语言INI解析器,C++可直接使用,支持只读模式,无需编译,只需包含头文件。
步骤:
- 下载
ini.h和ini.c(或仅用纯头文件版ini.hpp,GitHub上有C++封装) - 将头文件加入工程,确保
INI_USE_STACK宏未定义(避免栈溢出风险) - 实现回调函数,按节(section)、键(key)、值(value)逐行处理
示例(test.ini):
[database] host = 127.0.0.1 port = 3306 timeout = 5 [log] level = info path = ./logs/app.log
C++代码(使用 inih 的 C++ 封装 ini.hpp):
#include "ini.hpp"
#include <iostream>
#include <string>
struct Config {
std::string db_host = "localhost";
int db_port = 3306;
int db_timeout = 3;
std::string log_level = "warn";
std::string log_path = "./app.log";
};
Config load_ini(const std::string& filename) {
Config cfg;
INIReader reader(filename);
if (reader.ParseError() != 0) {
std::cerr << "Can't load " << filename << "\n";
return cfg;
}
cfg.db_host = reader.Get("database", "host", cfg.db_host);
cfg.db_port = reader.GetInteger("database", "port", cfg.db_port);
cfg.db_timeout = reader.GetInteger("database", "timeout", cfg.db_timeout);
cfg.log_level = reader.Get("log", "level", cfg.log_level);
cfg.log_path = reader.Get("log", "path", cfg.log_path);
return cfg;
}
用 nlohmann/json 读取 JSON 文件
nlohmann/json 是目前最流行的C++ JSON库,头文件即用,语法直观,支持现代C++特性(如结构体映射)。
捏Ta
捏Ta 是一个专注于角色故事智能创作的AI漫画生成平台
322
查看详情
步骤:
- 下载
json.hpp,放入项目目录(或用 vcpkg/conan 安装) -
#include "json.hpp",使用nlohmann::json类型 - 用
json::parse()或json::parse_file()加载内容
示例(config.json):
{
"database": {
"host": "127.0.0.1",
"port": 3306,
"timeout": 5
},
"log": {
"level": "info",
"path": "./logs/app.log"
}
}
C++代码(含结构体自动反序列化):
#include "json.hpp"
#include <fstream>
#include <iostream>
#include <string>
using json = nlohmann::json;
struct Config {
struct Database { std::string host; int port; int timeout; };
struct Log { std::string level; std::string path; };
Database database;
Log log;
};
void from_json(const json& j, Config::Database& d) {
d.host = j.value("host", "localhost");
d.port = j.value("port", 3306);
d.timeout = j.value("timeout", 3);
}
void from_json(const json& j, Config::Log& l) {
l.level = j.value("level", "warn");
l.path = j.value("path", "./app.log");
}
void from_json(const json& j, Config& c) {
c.database = j.at("database").get<Config::Database>();
c.log = j.at("log").get<Config::Log>();
}
Config load_json(const std::string& filename) {
std::ifstream f(filename)
;
try {
json j = json::parse(f);
return j.get<Config>();
} catch (const json::exception& e) {
std::cerr << "JSON parse error: " << e.what() << "\n";
return {};
}
}
选择建议与注意事项
INI适合简单扁平配置(如桌面工具、嵌入式),人类易读写;JSON适合嵌套结构、跨语言协作(如服务端配置、API响应模拟)。
- inih 不支持注释保留、写入或Unicode BOM,如需写配置请选
minIni或SimpleIni - nlohmann/json 默认不校验字段缺失,用
j.at("key")可抛异常,用j.value("key", default)更安全 - 路径问题:确保配置文件路径正确,建议用相对路径 + 可执行文件所在目录拼接(可用
argv[0]解析) - 生产环境建议加错误日志和默认兜底值,避免因配置缺失导致崩溃
基本上就这些。两个库都足够轻、文档全、社区稳,选一个上手快,配好一次就能复用多年。
以上就是C++如何读取配置文件(ini/json)?(方法与示例)的详细内容,更多请关注其它相关文章!
# 南开区营销推广网站
# 器中
# 并在
# 如何将
# 都是
# 译为
# 编译成
# 廊坊网站优化实战营销
# 唐山SEO营销技巧
# 头文件
# 曲靖网站建设设计
# 抖音企业店的推广营销
# 节日推广营销策略
# 黄酒的营销推广策略分析
# 网站建设买域名
# 重庆seo搜索优化排名
# seo快排效果专业乐云seo
# js
# 是一个
# 回调
# 标准库
# 配置文件
# stream
# ios
# c++
# 栈
# 工具
# 回调函数
# app
# c语言
# github
# json
# git
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
京东单号查询入口_京东快递订单追踪入口
J*a TimerTask中HashMap意外清空的深层原因与解决方案
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
Python模块化编程:有效管理依赖与避免循环引用
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
Win11怎么关闭快速启动_Win11彻底关机设置教程
押井守高度称赞《辐射4》:玩了八年都停不下来!
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
Python类型检查:优化关联可选属性的Mypy推断策略
Django表单验证失败时保留用户输入数据的最佳实践
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
优化大型XML文件解析:基于Python流式处理的内存高效方案
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
痛风发作了怎么办? 快速止痛和后期饮食调理
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
AO3同人作品网入口 AO3搜索引擎官网永久地址
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】
J*aScript中localStorage数据的获取、清洗与格式化教程
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
Golang指针如何与map组合使用_Golang map指针组合实践
小米汽车11月交付量突破40000台!雷军:将继续努力
微信网页版扫码登录入口 微信网页版二维码登录入口
poki免费入口快捷访问 poki人气小游戏直接玩站点
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
Mac怎么锁定备忘录_Mac备忘录加密设置教程
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
夸克浏览器图书入口 夸克手机浏览器阅读入口
知音漫客正版漫画平台_知音漫客官网账号登录
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
Go语言中动态执行代码字符串的策略与实践
处理嵌套交互式控件:前端可访问性指南
随机参数递归函数的基准调用次数与时间复杂度探究
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
机器学习中对数变换预测结果的反向还原
J*aScript打印功能_j*ascript输出控制
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
Lar*el Form Request中唯一性验证在更新操作中的正确实现
qq游戏大厅官方下载_qq游戏免费下载安装入口
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新


2025-12-13
浏览次数:次
返回列表
;
try {
json j = json::parse(f);
return j.get<Config>();
} catch (const json::exception& e) {
std::cerr << "JSON parse error: " << e.what() << "\n";
return {};
}
}