c++如何解析ini配置文件_简单ini解析器类实现【实战】

陌磊君_9536

陌磊君_9536

2026-04-10

958人浏览

原创

不能直接用fscanf逐行手撕,因为ini文件存在节名含空格、等号前后任意空白、值带引号/注释/换行续行等硬伤,fscanf易漏注释、吃引号、崩在空行和嵌套空格上。

c++如何解析ini配置文件_简单ini解析器类实现【实战】

ini文件解析为什么不能直接用fscanf逐行手撕

因为.ini看似简单,实际有几处硬伤:节名[section]可能含空格或特殊字符;键值对里key = value的等号前后可能有任意空白;value 可能带引号("path/to/file")、注释(; comment# comment)、甚至换行续行(

value = line1 \<br>line2
)。用fscanf硬匹配%[^=]=%[^\n]会漏掉注释、吃掉引号、崩在空行和嵌套空格上。

实操建议:

  • std::getline逐行读,避免C风格IO对换行/编码的隐式处理差异
  • 每行先trim首尾空白(自己写个ltrim/rtrim或用find_first_not_of
  • 跳过空行和以;#开头的行——注意要跳过空白后再判断,否则␣␣#comment会被误判为有效键
  • 节名解析用line.substr(1, line.size()-2)太危险,得先确认首尾是[],且中间无嵌套]

如何安全提取key = value并保留原始语义

等号不是唯一分隔符:有些ini允许key:valuekey value(空格分隔),但标准=最常见。关键是要找“第一个未被引号包裹的等号”——否则path = "C:\foo\bar.ini"里的反斜杠和等号都得原样保留。

实操建议:

  • 遍历字符串,用布尔标志in_quotes跟踪是否在双引号内(单引号同理,但多数ini只认双引号)
  • 遇到"翻转in_quotes;遇到\后紧跟"则跳过转义(即\"不结束引号)
  • 找到第一个=!in_quotes时切分,左边trim后是key,右边trim后才是value
  • value若以"开头且以"结尾,需剥掉引号并处理内部\" → 替换为",其他\n\t按需展开

std::map<:string std::map std::string>></:string>存数据够不够

够用,但有隐患:节名和键名大小写敏感性不统一。Windows ini默认不区分大小写([NETWORK][network]是同一节),Linux工具常区分。C++std::map默认按operator字典序比较,<code>"A""a"绝对不同。

Pandas 配置文件报告生成器
Pandas 配置文件报告生成器

使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。

下载

实操建议:

  • 若目标平台明确(如只跑Windows),插入前把节名/键名全转小写:std::transform(s.begin(), s.end(), s.begin(), ::tolower)
  • 不要直接用std::map嵌套——查config["Section"]["host"]前得先检查"Section"是否存在,否则触发隐式插入空map,后续.empty()判断失效
  • 更稳的方式是封装一层get_string(const std::string& section, const std::string& key, const std::string& def = ""),内部用find + at,找不到直接返回def
  • 避免存储原始std::string值,改用std::optional<:string></:string>标记“该key存在但值为空”(如enabled=

为什么GetPrivateProfileString在跨平台项目里要慎用

这是Windows API,Linux/macOS没有对应函数。即便你只开发Windows客户端,也会踩坑:它默认使用ANSI编码(CP_ACP),遇到UTF-8保存的ini(比如用户用VS Code另存为UTF-8 without BOM),中文全变乱码;而且它不支持#注释,遇到就截断。

实操建议:

  • 跨平台项目一律自己解析,别依赖GetPrivateProfileStringQSettings(Qt绑定太重)
  • 读文件时强制用std::ifstream配合std::codecvt_utf8或C++11后推荐用std::filesystem::u8path(C++20)确保UTF-8正确加载
  • 如果必须兼容老系统,至少加一层包装:Windows下优先用GetPrivateProfileStringW(宽字符版),再转UTF-8;其他平台走自解析

真正麻烦的不是语法解析,而是用户会把ini当脚本用:写port = ${BASE_PORT}+100、搞include = common.ini、甚至塞JSON片段进去。这种需求一出现,就得承认——这不是ini,是配置语言,该换tomlyaml了。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ 配置文件

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
视频后缀名都有哪些
视频后缀名都有哪些

视频后缀名都有avi、mpg、mpeg、rm、rmvb、flv、wmv、mov、mkv、ASF、M1V、M2V、MPE、QT、VOB、RA、RMJ、RMS、RAM、等等。更多关于视频后缀名的相关知识,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

2023.10.31

9485

17

C++ Qt图形开发
C++ Qt图形开发

本专题专注于 C++ Qt框架在图形界面开发中的应用,系统讲解窗口设计、信号与槽机制、界面布局、事件处理、数据库连接与跨平台打包等核心技能,通过多个桌面应用项目实战,帮助学员快速掌握 Qt 框架并独立完成跨平台GUI软件的开发。

2025.08.15

3502

7

C++ 图形界面开发基础(Qt方向)
C++ 图形界面开发基础(Qt方向)

本专题系统讲解 使用 C++ 与 Qt 进行图形界面(GUI)开发的核心技能,内容涵盖 Qt 项目结构、窗口组件、信号与槽机制、事件处理、布局管理、资源管理,以及跨平台编译与打包流程。通过多个小型桌面应用实战案例,帮助学习者掌握从界面设计到功能实现的完整 GUI 开发能力。

2025.12.05

1341

15

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1955

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2562

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

896

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

2859

7

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5039

3

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

1878

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Valgrind Quick Start Guide
Valgrind Quick Start Guide

共0课时 | 0人学习

CLion CMake 快速入门教程
CLion CMake 快速入门教程

共0课时 | 0人学习