c++如何读取和解析经典的Windows .ini配置文件_简易解析器实现【详解】

轻强同学_5830

轻强同学_5830

2026-04-04

433人浏览

原创

windows .ini文件需手写解析,用fgets/std::getline逐行读取并切分,以std::map存储,注意trim空格、编码兼容、安全访问及数值转换。

c++如何读取和解析经典的windows .ini配置文件_简易解析器实现【详解】

Windows .ini 文件没有标准 C++ 库支持,必须手写解析逻辑;直接用 fgets + 字符串切分是最轻量、最可控的方式,比引入 Boost.PropertyTree 或 INIReader 第三方库更适配“简易”需求。

INI 文件的结构特征决定了不能用通用配置解析器

典型的 Windows .ini 文件是纯文本,格式固定:以 [section] 开头的节,其后每行是 key=value(允许空格、注释以 ; 或 # 开头),不嵌套、无类型、无转义(除个别旧版扩展外)。这意味着:

  • 不需要 JSON/YAML 那类递归解析器,也无需处理引号或 Unicode 转义
  • std::getline 逐行读取 + std::string::find/std::string::substr 切分足够可靠
  • 注意:Windows API 的 GetPrivateProfileString 虽可用,但仅限 ANSI 编码、不支持 UTF-8、且在非 Windows 平台不可用,跨平台项目应避免

用 std::map<:string std::map std::string>></:string> 存储解析结果

这是最直观的内存结构:外层 key 是 section 名,内层 key 是属性名,value 是字符串值。示例代码片段:

std::map<:string std::map std::string>> ini;
std::string line, section;
std::ifstream file("config.ini");
while (std::getline(file, line)) {
    // 去首尾空格
    auto trim = [](const std::string& s) -> std::string {
        size_t b = s.find_first_not_of(" 	
");
        size_t e = s.find_last_not_of(" 	
");
        return (b == std::string::npos) ? "" : s.substr(b, e - b + 1);
    };
    line = trim(line);
    if (line.empty() || line[0] == ';' || line[0] == '#') continue;
    if (line[0] == '[' && line.back() == ']') {
        section = trim(line.substr(1, line.length() - 2));
        continue;
    }
    size_t eq = line.find('=');
    if (eq != std::string::npos) {
        std::string key = trim(line.substr(0, eq));
        std::string val = trim(line.substr(eq + 1));
        ini[section][key] = val;
    }
}
</:string>

关键点:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 必须手动 trim 空格,否则 "key = value" 会导致 key 变成 "key "
  • 节名和键名区分大小写(Windows 默认不区分,但 C++ 解析器默认区分;如需兼容,统一转小写再存)
  • 不处理反斜杠续行、双引号包裹值等非经典用法——它们不属于“经典 .ini”规范

读取时常见错误:编码与换行符

Windows 上的 .ini 文件通常是 ANSI(即系统本地编码,如 GBK)或 UTF-8(无 BOM)。C++ std::ifstream 默认按字节读取,不自动识别编码:

  • 若文件含中文且为 GBK 编码,用 UTF-8 编译的程序读出来就是乱码——此时应改用 std::wifstream + std::locale 绑定 codepage(如 936),或提前转 UTF-8
  • 换行符为 ,std::getline 默认按 切割,会把 留在行末——这就是为什么必须做 trim
  • 不要用 file >> line,它遇空格就停,无法读完整行

获取值时的健壮性检查不能省

调用方代码很容易写成 ini["network"]["port"],但若 section 或 key 不存在,会触发隐式插入空 map/空 string,掩盖配置缺失问题:

  • 封装一个安全访问函数,例如:get_value(ini, "network", "port", "8080"),内部用 find() 判断是否存在
  • 数值转换(如 int、bool)必须单独做,std::stoi 遇非法字符串会抛异常,建议用 std::from_chars(C++17)或 strtol 检查 endptr
  • 路径类值(如 log_path=C:pplog)中的反斜杠不用转义——.ini 是纯文本,C:\app\log 是用户写错了,不是你代码要修的

真正麻烦的从来不是语法解析,而是用户把注释写在等号后面、把空格塞进键名、或者用记事本另存为 UTF-8 with BOM——这些细节比算法本身更消耗调试时间。

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

相关专题

更多
json数据格式
json数据格式

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

2023.08.07

2135

5

json是什么
json是什么

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

2023.08.23

3282

1

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

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

2023.10.13

1096

3

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

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

2025.09.10

3759

7

string转int
string转int

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

2023.08.02

6419

3

fgets在c语言中的用法
fgets在c语言中的用法

本专题整合了c语言中fgets用法介绍,阅读专题下面的文章了解更多详细内容。

2025.08.27

153

4

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1758

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2704

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6084

49

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习