新闻中心

C++如何读取配置文件(ini/json)?(方法与示例)

2025-12-13
浏览次数:
返回列表
C++读取配置文件推荐使用inih解析INI和nlohmann/json解析JSON:inih轻量无依赖,适合扁平配置;nlohmann/json支持嵌套与结构体映射,适合复杂跨语言场景。

c++如何读取配置文件(ini/json)?(方法与示例)

读取配置文件在C++中很常见,但标准库不直接支持INI或JSON格式,需要借助第三方库或手动解析。下面介绍两种主流方式:用 inih 读INI,用 nlohmann/json 读JSON,都是轻量、头文件仅需、无依赖的推荐方案。

用 inih 读取 INI 文件

inih(INI Not Invented Here)是一个极简的C语言INI解析器,C++可直接使用,支持只读模式,无需编译,只需包含头文件。

步骤:

  • 下载 ini.hini.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

捏Ta 是一个专注于角色故事智能创作的AI漫画生成平台

捏Ta 322 查看详情 捏Ta

步骤:

  • 下载 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,如需写配置请选 minIniSimpleIni
  • 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分钟抛亮如新 

搜索