0

0

c++中如何实现简单的INI配置文件读取_c++解析配置文件方法【实例】

穿越時空

穿越時空

发布时间:2026-01-28 12:57:32

|

438人浏览过

|

来源于php中文网

原创

用std::ifstream手动解析INI文件最直接,需逐行读取、处理注释/空行/节名/键值对,注意\r清理、大小写处理、默认节及编码问题。

c++中如何实现简单的ini配置文件读取_c++解析配置文件方法【实例】

std::ifstream 手动解析 INI 文件最直接

INI 文件本质是纯文本,没有标准库支持,C++ 里最轻量、最可控的方式就是自己读行、切分、跳过注释和空行。不需要引入第三方库,适合嵌入式或极简项目。

关键点在于:INI 的节([section])和键值对(key=value)都有固定格式,但容错性差——比如等号前后有空格、值含 # 号、引号包裹、反斜杠转义等,都得自己处理。

  • std::getline() 逐行读取,跳过以 ;# 开头的注释行和空行
  • 遇到 [section_name] 时提取节名,后续所有键值对归属该节
  • 对普通行用 find('=') 找第一个等号,左侧 trim 后为 key,右侧 trim 后为 value
  • 注意:Windows 换行符是 \r\n,Linux 是 \nstd::getline() 默认按 \n 切分,\r 会残留在字符串末尾,务必用 erase(remove(...)) 清掉

封装成 IniParser 类管理 section 和 key-value 映射

手动解析一次后,数据散在多个变量里很难复用。推荐用 std::map<:string std::map std::string>> 存储:外层 key 是 section 名,内层是 key-value 对。这样查配置就像 ini["network"]["port"] 一样自然。

常见坑:

立即学习C++免费学习笔记(深入)”;

  • section 名区分大小写,但很多实际 INI(尤其 Windows 工具生成的)默认不区分,建议统一转小写再存
  • 同一个 key 在同一 section 出现多次时,后出现的会覆盖前一个——这是大多数解析器的行为,不是 bug
  • 没声明 section 就直接写 key=value,应归入默认节(如 "DEFAULT"),否则容易丢数据
class IniParser {
public:
    std::map> data;
void parse(const std::string& filename) {
    std::ifstream file(filename);
    std::string line, current_section = "DEFAULT";
    while (std::getline(file, line)) {
        line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());
        if (line.empty() || line[0] == ';' || line[0] == '#') continue;
        if (line[0] == '[' && line.find(']') != std::string::npos) {
            current_section = line.substr(1, line.find(']') - 1);
            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));
            data[current_section][key] = val;
        }
    }
}

private: std::string trim(const std::string& s) { size_t l = s.find_first_not_of(" \t"); size_t r = s.find_last_not_of(" \t"); return (l == std::string::npos) ? "" : s.substr(l, r - l + 1); } };

std::stoi/std::stof 安全转换数值类型

INI 里的值全是字符串,业务代码里常要转成 intfloatbool。别直接用 atoiatof——它们遇到非法输入返回 0,无法区分“真就是 0”和“解析失败”。

飞书妙记
飞书妙记

飞书智能会议纪要和快捷语音识别转文字

下载

正确做法是用 std::stoi 等,并捕获 std::invalid_argumentstd::out_of_range 异常:

  • bool 建议约定值为 "true"/"false""1"/"0",不要依赖字符串非空即 true
  • 整数溢出时 std::stoistd::out_of_range,比静默截断安全得多
  • 如果某配置项缺失,应提供默认值,而不是让程序崩溃;可用 data[section].count(key) 先判断是否存在

跨平台路径与编码问题不能忽略

Windows 上记事本保存的 INI 文件默认是 GBK 编码,而 C++ 标准流在 Linux/macOS 下默认按 UTF-8 解析。如果文件含中文,std::ifstream 会读成乱码——这不是解析逻辑的问题,是编码层就错了。

解决方式有限:

  • 强制要求配置文件保存为 UTF-8 无 BOM(推荐,VS Code、Notepad++ 都可设)
  • Windows 下可用 std::wifstream + imbue 设置本地 locale,但移植性差
  • 更稳妥的做法是:先用系统 API(如 Windows 的 MultiByteToWideChar)或轻量库(如 utf8cpp)做预转换,再喂给解析器
  • 路径分隔符也需注意:"config\settings.ini" 在 Linux 下打不开,应统一用 /std::filesystem::path 拼接

真正麻烦的从来不是怎么切等号,而是没人告诉你:那个看似正常的中文配置项,其实从打开文件那一刻起就已经是乱码了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

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

443

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

578

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

102

2025.10.23

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

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

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

530

2023.09.20

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

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

298

2023.08.03

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

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

212

2023.09.04

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

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

1500

2023.10.24

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

1

2026.01.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.9万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号