[C++] 如何操作ini文件

什么是ini文件?

INI文件(.ini)是一种常见的配置文件格式,用于存储程序、操作系统或设备驱动程序的配置信息。INI是"Initialization"的缩写,指的是初始化。INI文件通常是纯文本文件,在Windows操作系统中广泛使用。它以一种简单的键值对(Key-Value)的格式存储配置信息,其中每个配置项都有一个唯一的键和一个对应的值。INI文件可以用记事本等文本编辑器进行编辑,允许用户修改和自定义程序的设置和选项。

INI文件格式是一种基于文本的格式,其内容由节(Section)、键(Key)和值(Value)组成。以下是INI文件的基本格式:

  1. 节(Section): 节是INI文件的顶级分组,用方括号([])括起来,如:[Section1]。节的作用是将不同的配置项进行分类,方便管理和查找。

  2. 键(Key): 键是配置项的名称,用等号(=)或冒号(:)与值分隔,如:Key1=Value1。键用于表示某个配置项的标识符。

  3. 值(Value): 值是配置项的具体设置值,通常是字符串类型,如:Value1。值表示与键对应的具体配置项的值或选项。

示例:

[Section1]
Key1=Value1
Key2=Value2

[Section2]
Key3=Value3
Key4=Value4

在这个示例的INI文件中,有两个节(Section1和Section2),每个节下面有一些键值对配置项。Section1下有两个配置项Key1和Key2,它们的值分别为Value1和Value2。Section2下有两个配置项Key3和Key4,它们的值分别为Value3和Value4。通过INI文件的格式,可以将多个配置项进行逻辑分组,方便管理和修改。

C++如何操作ini文件

通过GetPrivateProfileStringGetPrivateProfileIntWritePrivateProfileString等函数来读写INI文件

在Win32平台上,可以使用GetPrivateProfileStringGetPrivateProfileIntWritePrivateProfileString等函数来读写INI文件。

GetPrivateProfileString函数是Windows API中用于从INI文件中读取配置信息的函数。它的参数包括:

  1. lpAppName:INI文件中的节名称,可以理解为配置信息的分类。例如,如果INI文件中有一个名为[Database]的节,那么lpAppName的值应该是"Database"。

  2. lpKeyName:INI文件中的键名,用于标识特定的配置项。例如,如果INI文件中有一个名为"Server"的键,那么lpKeyName的值应该是"Server"。

  3. lpDefault:如果在INI文件中找不到指定的节或键名,就会返回lpDefault指定的默认值。该参数可以为空。

  4. lpReturnedString:用于接收从INI文件中读取到的配置项的值。函数会将读取到的值复制到这个参数指向的缓冲区中。

  5. nSize:指定lpReturnedString参数指向的缓冲区的大小。

  6. lpFileName:INI文件的路径和文件名。

WritePrivateProfileString函数是Windows API中用于向INI文件中写入配置信息的函数。它的参数包括:

lpAppName:INI文件中的节名称,可以理解为配置信息的分类。例如,如果要写入一个名为[Database]的节,那么lpAppName的值应该是"Database"。

lpKeyName:INI文件中的键名,用于标识特定的配置项。例如,如果要写入一个名为"Server"的键,那么lpKeyName的值应该是"Server"。

lpString:要写入INI文件的配置项的值。

lpFileName:INI文件的路径和文件名。

以下是使用这些函数的示例代码:

#include <iostream>
#include <Windows.h>

int main() {
    const char* filePath = "d:\\config.ini";
    const char* section = "Section1";
    const char* key = "Key1";
    const char* defaultValue = "default value";

    // 读取INI文件中的值
    char buffer[256];
    GetPrivateProfileString(section, key, defaultValue, buffer, sizeof(buffer), filePath);
    std::cout << "Value: " << buffer << std::endl;

    // 写入INI文件
    const char* newValue = "new value";
    WritePrivateProfileString(section, key, newValue, filePath);

    // 再次读取INI文件中的值
    char buffer2[256];
    GetPrivateProfileString(section, key, defaultValue, buffer2, sizeof(buffer2), filePath);
    std::cout << "New Value: " << buffer2 << std::endl;

    return 0;
}

在上述示例代码中,GetPrivateProfileString函数用于从INI文件中读取指定节和键的值。section参数指定要读取的节,key参数指定要读取的键,defaultValue参数指定在找不到值时的默认返回值。函数将读取的值存储在buffer数组中。

WritePrivateProfileString函数用于向INI文件中写入键值对。section参数指定要写入的节,key参数指定要写入的键,newValue参数指定要写入的值。

main函数中,指定了要读取和写入的INI文件路径、目标节和目标键。首先调用GetPrivateProfileString函数读取INI文件中键的值,并输出到控制台。然后,调用WritePrivateProfileString函数将新的值写入INI文件。

备注:

Visual Studio中运行代码必须使用MBCS字符集。

在Visual C++项目中,有以下字符集选项可供选择:

  1. Multi-Byte Character Set (MBCS):使用多字节字符集。这是默认的字符集选项,支持多字节编码,如ANSI。该选项兼容性较好,但不支持Unicode字符。

  2. Unicode Character Set:使用Unicode字符集。该选项支持Unicode编码,可以处理各种语言的字符。推荐在新项目中选择此选项。

  3. Not Set:未设置字符集选项。此时,编译器将使用系统默认的字符集。

选择适当的字符集选项取决于项目的需求和目标平台。在支持多语言环境或需要处理Unicode字符的情况下,建议选择Unicode字符集选项。

通过设置字符集来控制UNICODE宏定义来决定是使用GetPrivateProfileStringW还是GetPrivateProfileStringA函数:

使用第三方开源库

mirrors_SSARCandy/ini-cpp (gitee.com)

GitHub - SSARCandy/ini-cpp: 📑 Yet another ini config parser for modern C++

test.cpp: 

# define _CRT_SECURE_NO_WARNINGS
#include "ini/ini.h"
#include <sstream>

template<typename T>
std::string to_string(std::vector<T> lst, std::string delimiter)
{
    std::stringstream ss;

    for (int i = 0; i < lst.size(); i++) {
        if (i < lst.size() - 1) {
            ss << lst[i] << delimiter;
        }
        else {
            ss << lst[i];
        }
    }

    return ss.str();
}

int main() {
    inih::INIReader r{"config.ini"};

    // Get and parse the ini value
    const auto& v1 = r.Get<std::string>("section1", "any"); // "5"
    const auto& v2 = r.Get<int>("section1", "any"); // 5
    const auto& v3 = r.Get<double>("section1", "any"); // 5.0
    const auto& v4 = r.GetVector<float>("section2", "any_vec"); // [1.0, 2.0, 3.0]
    const auto& v5 = r.GetVector<std::string>("section2", "any_vec"); // ["1", "2", "3"]
    std::cout << "v1=" << v1 << std::endl;
    std::cout << "v2=" << v2 << std::endl;
    std::cout << "v3=" << v3 << std::endl;
    std::cout << "v4=" << to_string<float>(v4,",") << std::endl;
    std::cout << "v5=" << to_string<std::string>(v5, ",") << std::endl;
    // And also support writing to new ini file.
    r.InsertEntry("new_section", "key1", 5); // Create new entry
    inih::INIWriter::write("output.ini", r); // Dump ini to file

    return 0;
}

config.ini:(运行时需要复制到exe所在的目录)

[section1]

any=1
any2:true
not_int = hello
not_int_arr = a b c d e

[section2]

any_vec = 1 2 3
doubles = 1.23 4.56

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/406915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《TCP/IP详解 卷一》第3章 链路层

目录 3.1 引言 3.2 以太网 3.3 全双工 省点 自动协商 流量控制 3.4 网桥和交换机 3.5 WiFi 3.6 PPP协议 3.6.1 PPP协议流程 3.7 环回 3.8 MTU和路径MTU 3.9 隧道基础 3.9.1 GRE 3.9.2 PPTP 3.9.3 L2TP 3.10 与链路层相关的攻击 3.11 总结 3.1 引言 城域网&…

如何将负压控制信号转换为正电压

多电源域系统中&#xff0c;时常会出现负电压&#xff0c;比如双电源运放&#xff0c;比如射频功率放大器的栅极偏置电压等。以射频功率放大器的栅极偏置电压和VDD上电为例&#xff0c;是要考虑上电顺序的&#xff0c;参见博文《功放的上电顺序》https://blog.csdn.net/mzldxf/…

什么是nginx 、安装nginx、nginx调优

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2 nginx模块与作用 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错…

设备树详解

设备树(Device Tree)基本概念及作用 设备树(Device Tree)基本概念 在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的…

leet hot 100-1 两数之和

两数之和 原题链接思路代码 原题链接 leet hot 100-1 1. 两数之和 思路 可以把当前数字放到容器里面去 当我们遍历一个新的数字的时候 减一下与目标值的差 然后得到的结果在容器里面查看是否存在 时间复杂度O(n) 空间复杂度(n) 代码 class Solution { public:vector<…

修复 Android 手机陷入恢复模式的 5 种方法

您的手机卡在 Android Recovery 模式且无法退出此模式&#xff1f;无论您按什么按钮组合&#xff0c;甚至在取出并重新插入电池后重新启动手机&#xff0c;手机都会启动回到恢复模式吗&#xff1f; Android卡在recovery模式的情况并不罕见&#xff0c;各种品牌的Android手机都…

EasyRecovery易恢复14好不好用?恢复速度怎么样

EasyRecovery易恢复14的恢复速度相对较快&#xff0c;但具体的恢复速度取决于多个因素。以下是一些影响恢复速度的主要因素&#xff1a; 存储设备性能&#xff1a;恢复速度受到存储设备性能的影响。如果存储设备&#xff08;如硬盘、U盘等&#xff09;的读写速度较慢&#xff…

nginx搭建直播rtmp推流,httpflv拉流环境

背景 工作中发现挺多直播CDN在实现httpflv拉流时都没有使用http chunk编码&#xff0c;而是直接使用no-content-length的做法。所以想自己搭建一个直播CDN支持 http chunk编码。 环境搭建 系统环境 Ubuntu 18.04.4 LTS 软件 nginx-1.18.0 nginx扩展模块 nginx-http-flv-mo…

Ubuntu环境安装MySQL数据库

1.安装过程 打开终端&#xff08;Terminal&#xff09;窗口&#xff0c;使用以下命令更新系统软件包&#xff1a; sudo apt update ubuntu环境安装mysql-server和mysql开发包&#xff0c;包括mysql头文件和动态库文件&#xff0c;命令如下&#xff1a; sudo apt-get instal…

代码随想录算法训练营第60天 | 647.回文子串 + 516.最长回文子序列 + 动态规划总结篇

今日任务 647. 回文子串 516.最长回文子序列 动态规划总结篇 647.回文子串 - Medium 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串…

【Spring面试题】

目录 前言 1.Spring框架中的单例bean是线程安全的吗? 2.什么是AOP? 3.你们项目中有没有使用到AOP&#xff1f; 4.Spring中的事务是如何实现的&#xff1f; 5.Spring中事务失效的场景有哪些&#xff1f; 6.Spring的bean的生命周期。 7.Spring中的循环引用 8.构造方法…

海外媒体发稿:链游媒体宣发推广7种有效策略解析-华媒舍

随着区块链技术的不断发展&#xff0c;链游&#xff08;区块链游戏&#xff09;已经成为了游戏市场中备受瞩目的一部分。仅仅开发出一款出色的链游并不足以成功&#xff0c;而有效的宣发推广策略则是不可或缺的。 本文将介绍7种有效的链游媒体宣发推广策略&#xff0c;帮助您了…

一、初始 Vue

1、Vue 1.1 Vue简介 1.1.1 Vue.js 是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…

wordpress免费主题模板

免费大图wordpress主题 首页是一张大图的免费wordpress主题模板。简洁实用&#xff0c;易上手。 https://www.jianzhanpress.com/?p5857 wordpress免费模板 动态效果的wordpress免费模板&#xff0c;banner是动态图片效果&#xff0c;视觉效果不错。 https://www.jianzhan…

Freertos实时操作系统---基于STM32

一、Freertos简介 1.Freertos介绍 1&#xff09;RTOS指的是一类的实时操作系统 2&#xff09;rtos的使用&#xff1a;用户根据对任务来设置其优先级然后来使用调度器来决定哪一个任务来先执行。 3&#xff09;Freertos的文件数量远低于其他操作系统 4&#xff09;主要特点&…

记一次生产jvm oom问题

前言 jvm添加以下参数&#xff0c;发生OOM时自动导出内存溢出文件 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/opt 内存分析工具&#xff1a; MAT, 下载地址&#xff1a;Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation&#xff0c; 注意工具地址…

Jmeter学习系列之六:阶梯加压线程组Stepping Thread Group详解

性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间。 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:Stepping Thread Group 1、下载配置方法 1.1.下载配置 插件下载地址:…

AR如何赋能风电产业大揭秘!

一、方案简介 方案名称&#xff1a;安宝特AR风电解决方案 应用场景&#xff1a;远程维修、培训、诊断、运维、巡检 安宝特AR风电行业解决方案以降本增效为核心目标&#xff0c;从场景应用出发&#xff0c;在风机制造与组装、运维与维护、故障诊断与维修、客户协同售后等领域&…

第七篇:CamX Sensor Bringup

第七篇:CamX Sensor Bringup 一、sensor 驱动文件编写 sensor驱动相关的文件目录在chi-cdk/oem/qcom/sensor 下。一般如果能直接从模组厂上拿到已经写好的驱动文件,那是最好的了。 如果没有,那就只能是拿到提供的寄存器setting参数,自己来写。 我们可以参考已有的驱动文…

应用回归分析:贝叶斯回归

贝叶斯回归是一种统计方法&#xff0c;它利用贝叶斯定理来更新对回归参数的估计。这种方法不仅考虑了数据的不确定性&#xff0c;还考虑了模型参数的不确定性&#xff0c;为预测提供了一个更加全面的框架。在本文中&#xff0c;我们将深入探讨贝叶斯回归的基本概念、如何实现它…