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

c++常见配置文件格式 JSON、INI、XML、YAML 它们如何解析

1. INI 格式(最简单、Windows 原生)

示例config.ini

ini

[Server] IP = 127.0.0.1 Port = 8080 MaxConn = 100 [App] Name = MyServer Version = 1.0.0

C++ 解析(Windows 原生 API,无需库)

cpp

运行

windows: ------------------------------------------- #include <Windows.h> int main() { char ip[32] = {0}; char port[16] = {0}; // 读取 GetPrivateProfileStringA("Server", "IP", "", ip, 32, "./config.ini"); GetPrivateProfileStringA("Server", "Port", "", port, 16, "./config.ini"); int portNum = atoi(port); return 0; } linux ------------------------------------------- /* 删除右边的空格 */ char *r_trim(char *szOutput, const char *szInput) { char *p = NULL; assert(szInput != NULL); assert(szOutput != NULL); assert(szOutput != szInput); strcpy(szOutput, szInput); for(p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p) { ; } *(++p) = '\0'; return szOutput; } /* 删除两边的空格 */ char * a_trim(char * szOutput, const char * szInput) { char *p = NULL; assert(szInput != NULL); assert(szOutput != NULL); l_trim(szOutput, szInput); for (p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p) { ; } *(++p) = '\0'; return szOutput; } //获取配置文件项信息 int GetProfileString(const char *profile, const char *AppName, const char *KeyName, char *KeyVal, const char *oVal) { char appname[32], keyname[32]; char *buf, *c; char buf_i[KEYVALLEN], buf_o[KEYVALLEN]; memcpy(KeyVal, oVal, strlen(oVal) + 1); FILE *fp; int found = 0; /* 1 AppName 2 KeyName */ if ((fp = fopen(profile, "r")) == NULL) { if(g_iLogLevel & 1) printf("openfile [%s] error [%s]", profile, strerror(errno)); return(-1); } fseek(fp, 0, SEEK_SET); memset(appname, 0, sizeof(appname)); sprintf(appname, "[%s]", AppName); while (!feof(fp) && fgets(buf_i, KEYVALLEN, fp) != NULL) { l_trim(buf_o, buf_i); if (strlen(buf_o) <= 0) continue; buf = NULL; buf = buf_o; if (found == 0) { if (buf[0] != '[') { continue; } else if (strncmp(buf, appname, strlen(appname)) == 0) { found = 1; continue; } } else if (found == 1) { if (buf[0] == '#') { continue; } else if (buf[0] == '[') { break; } else { if ((c = (char*)strchr(buf, '=')) == NULL) continue; memset(keyname, 0, sizeof(keyname)); sscanf(buf, "%[^=|^ |^\t]", keyname); if (strcmp(keyname, KeyName) == 0) { sscanf(++c, "%[^\n]", KeyVal); char *KeyVal_o = (char *)malloc(strlen(KeyVal) + 1); if (KeyVal_o != NULL) { memset(KeyVal_o, 0, strlen(KeyVal) + 1); a_trim(KeyVal_o, KeyVal); if (KeyVal_o && strlen(KeyVal_o) > 0) strcpy(KeyVal, KeyVal_o); free(KeyVal_o); KeyVal_o = NULL; } found = 2; break; } else { continue; } } } } fclose(fp); if (found == 2) return(0); else return(-1); }

优点

  • 最简单、开箱即用
  • Windows 原生 API,不需要任何第三方库
  • 轻量、人眼易读

缺点

  • 不支持嵌套、不支持数组
  • 仅适合简单配置

2. JSON(最通用、前后端通用)

示例config.json

json

{ "Server": { "IP": "127.0.0.1", "Port": 8080, "MaxConn": 100 }, "App": { "Name": "MyServer", "Version": "1.0.0" } }

C++ 解析(用nlohmann/json,单头文件神器)

cpp

运行

#include "nlohmann/json.hpp" #include <fstream> using json = nlohmann::json; int main() { std::ifstream f("config.json"); json data = json::parse(f); std::string ip = data["Server"]["IP"]; int port = data["Server"]["Port"]; std::string name = data["App"]["Name"]; return 0; }

优点

  • 几乎所有语言支持
  • 支持对象、数组、嵌套
  • 现代配置首选

缺点

  • 不能写注释(标准不支持)

3. XML(老式、偏重量级)

示例config.xml

xml

<Config> <Server> <IP>127.0.0.1</IP> <Port>8080</Port> </Server> </Config>

C++ 解析(用tinyxml2

cpp

运行

#include "tinyxml2.h" using namespace tinyxml2; int main() { XMLDocument doc; doc.LoadFile("config.xml"); XMLElement* server = doc.FirstChildElement("Config")->FirstChildElement("Server"); const char* ip = server->FirstChildElement("IP")->GetText(); return 0; }

优点

  • 结构化强、可扩展
  • 企业 / 旧项目常用

缺点

  • 臃肿、标签冗余
  • 阅读麻烦、解析代码长

4. YAML(最优雅、可读性最高)

示例config.yaml

yaml

Server: IP: 127.0.0.1 Port: 8080 MaxConn: 100 App: Name: MyServer Version: 1.0.0

C++ 解析(用yaml-cpp

cpp

运行

#include <yaml-cpp/yaml.h> int main() { YAML::Node config = YAML::LoadFile("config.yaml"); std::string ip = config["Server"]["IP"].as<std::string>(); int port = config["Server"]["Port"].as<int>(); return 0; }

优点

  • 人类友好,最干净
  • 支持注释、嵌套、数组
  • DevOps / 云原生 主流

缺点

  • 缩进敏感(像 Python)
  • C++ 库比 JSON 稍大

🚀 最终推荐

1.最简单 → INI

2.通用全能 → JSON(最推荐)

3.优雅高级 → YAML

4.老式企业项目 → XML

http://www.jsqmd.com/news/537052/

相关文章:

  • Qwen2.5-VL-7B-Instruct多模态教程:支持长图滚动识别与跨区域语义关联分析
  • eSpeak NG:AI时代开源TTS的终极定位与发展指南
  • Phi-4-Reasoning-Vision镜像免配置:预装FlashAttention-3加速多模态推理
  • 如何高效管理企业多账户:ente/auth 2FA认证器终极指南
  • Anthropic 连放两个大招:昨天接管你的电脑,今天甩掉你的审批
  • MangoHud文档版本比较:查看变更内容
  • Uvicorn源码中的迭代器模式:任务队列处理机制
  • 基于 Vue 的毕业设计实战:从选题到部署的全链路技术方案
  • 终极指南:如何为Claude Code Agent系统开发和注册自定义工具
  • Spring AI智能客服多轮问答实战:从架构设计到生产环境部署
  • 25.10.22
  • Windows定制终极指南:用Windhawk打造个性化系统
  • 会话记忆压缩策略揭秘,轻松解决Token爆炸难题
  • 深度学习本科毕设避坑指南:从选题到部署的全流程技术实践
  • GPEN定时任务配置:定期清理缓存与维护系统稳定
  • HunyuanVideo-Foley部署实战:从裸机安装到WebUI可访问的完整时间线
  • 前端国际化终极指南:p1xt-guides中i18n与L10n的完整实践方案
  • 工矿项目防爆密闭门鑫瑞上门安装售后保障:4级防盗门/5级防盗门/A型抗爆门/B型抗爆门/业务库/军用方舱/别墅密室门/选择指南 - 优质品牌商家
  • 终极M3U8下载神器:3步轻松掌握全网视频流保存技巧
  • 2025年数据资源入表年度发展报告
  • 10分钟精通语音识别:FunASR热词定制实战指南
  • Triton自定义操作开发:如何扩展GPU编程语言的终极指南
  • Chandra代码审查展示:自动发现Python潜在缺陷
  • 终极语音合成优化:espeak-ng的数据压缩与存储效率提升指南
  • pdf2htmlEX安全表单处理:防止表单劫持与数据泄露的终极指南
  • Python大模型服务响应超2s?(生产环境真实Trace链路全曝光)
  • 毕业设计系统实战:从零构建高可用选题管理平台
  • Qwen3-4B-Instruct-2507编程辅助:快速搭建+代码补全+调试实战
  • 本科生必看!全学科适配AI论文神器——千笔·专业降AI率智能体
  • 告别低效写作:盘点2026年备受推崇的AI论文写作工具