SimpleIni读中文路径需转UTF-16后用_wfopen打开再LoadFile;iniparser布尔值仅识别小写"true"/"on"/"yes"/"1";重复key中SimpleIni取最后、iniparser取最先;iniparser须配对freedict防泄漏。

SimpleIni 读取中文路径失败怎么办
Windows 下用 CSimpleIniA 打开含中文路径的 INI 文件,常直接返回 SI_FILE 错误,不是文件不存在,而是底层 fopen 拒绝宽字符路径。SimpleIni 本身不处理编码转换,它依赖 C 标准库的文件接口。
- 必须先用
MultiByteToWideChar把 UTF-8 路径转成 UTF-16,再调用_wfopen手动打开文件流 - 然后用
LoadFile(FILE*)接口传入该流(CSimpleIniW版本可省这步,但需确保整个工程用 Unicode 编译) - 若项目已用 UTF-8 字符串,别强行全局切
CSimpleIniW—— 容易导致GetString返回乱码,因为内部仍按字节解析
iniparser 解析布尔值时总返回 0
iniparser_getboolean 不是“读到 yes/true 就返 1”,它只认硬编码的几个字符串:"true"、"on"、"yes"、"1"(全小写,无空格),其余一律当 false。连 "True" 或 "TRUE" 都不行。
- 配置项写成
debug = true没问题,但debug = True或debug = YES就会静默失败 - 如果 INI 来自用户输入或旧系统,建议改用
iniparser_getstring先取原始值,再自己做大小写无关比较 - 注意:该函数对空值或缺失 key 返回
NULL,直接传给strcmp会崩,务必先判空
两个库对重复 key 的处理逻辑完全不同
同一 section 下出现两次 port = 8080,SimpleIni 保留最后一个,iniparser 保留第一个 —— 这不是 bug,是设计选择,但会影响热更新配置的行为。
- SimpleIni 的
SetString是覆盖语义,多次调用同 key 会覆盖前值;iniparser的iniparser_load是只读加载,之后不能改值,只能靠重载 - 如果业务需要“后写的 key 优先”,用 SimpleIni 更直观;如果想防误覆盖(比如 base.ini + user.ini 分层),iniparser 的“首见为准”反而更安全
- 两者都不支持数组式语法(如
server[] = a.com),要实现得自己拆字符串
内存泄漏风险点:忘记释放 iniparser 的 dictionary
iniparser_load 返回的 dictionary* 必须配对调用 iniparser_freedict,否则每次 reload 都吃几 KB 内存。SimpleIni 没这个问题,对象析构自动清理。
立即学习“C++免费学习笔记(深入)”;
- 常见错误:在循环里反复
iniparser_load却只在最后freedict一次 - 更隐蔽的是异常路径 —— 如果
iniparser_load返回NULL(文件打不开),freedict传NULL是安全的,但很多人没写这行,导致后续正常加载时漏掉释放 - 简单做法:用 RAII 包一层,或者至少确保每个
load后面紧跟freedict,哪怕中间有 return
真正麻烦的不是语法,是路径编码、key 覆盖顺序、还有谁负责 free —— 这些细节不写进日志,出问题时根本看不出是库的问题还是你忘了某一行。











