[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 valueconst auto& v1 = r.Get<std::string>("section1", "any"); // "5"const auto& v2 = r.Get<int>("section1", "any"); // 5const auto& v3 = r.Get<double>("section1", "any"); // 5.0const 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 entryinih::INIWriter::write("output.ini", r); // Dump ini to filereturn 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://xiahunao.cn/news/2806372.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【c++】模板初阶(泛型编程与模板)

1.泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(char& left, …

论文精读--GPT1

把transformer的解码器拿出来&#xff0c;在没有标号的大量文本数据上训练一个语言模型&#xff0c;来获得预训练模型&#xff0c;然后到子任务上微调&#xff0c;得到每个任务所需的分类器 Abstract Natural language understanding comprises a wide range of diverse tasks…

RabbitMq:什么是RabbitMq? ①

一、RabbitMq定位 RabbitMq是一个基于消息订阅发布的一款消息中间件。 二、技术原理 核心概念 server&#xff1a;又称broker&#xff0c;接受客户端连接&#xff0c;实现AMQP实体服务。缓存代理&#xff0c;Kafka集群中的一台或多台服务器统称broker.connection&#xff1a;…

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

介绍完了stack和queue的介绍以及模拟的相关内容后&#xff1a;C初阶&#xff1a;容器适配器介绍、stack和queue常用接口详解及模拟实现 接下来进行priority_queue的介绍以及模拟&#xff1a; 文章目录 1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_que…

模型 3C(顾客、公司、竞争)战略

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_总纲目录。洞悉自身&#xff0c;把握顾客&#xff0c;超越竞争。 1 3C(顾客、公司、竞争)战略模型的应用 1.1 3C战略模型在麦当劳公司中的应用 麦当劳在扩张国际市场时采用3C战略模型&#xff0c;具体如下&#xf…

Covalent Network(CQT)发展新里程碑:SOC 2 数据安全认证通过,进一步加强了其人工智能支持

Covalent Network&#xff08;CQT&#xff09;现已完成并通过了严格的 Service Organization Control&#xff08;SOC) 2 Type II 的合规性审计&#xff0c;通过由备受行业认可的机构执行&#xff0c;进一步证明了 Covalent Network&#xff08;CQT&#xff09;团队坚定不移地致…

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

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

数字电路 第二章—第一节(门电路—概述)

一、门电路的概念 实现基本和常用逻辑运算的电子电路称为逻辑门电路&#xff0c;简称门电路。例如&#xff0c;实现与运算的称为与门&#xff0c;实现或运算的称为或门&#xff0c;实现非运算的称为非门&#xff0c;也称为反相器&#xff1b;类似地&#xff0c;实现与非、或非、…

vue+nodejs+uniapp婚纱定制婚庆摄影系统 微信小程序 springboot+python

目前移动互联网大行其道&#xff0c;人人都手中拿着智能机&#xff0c;手机手机&#xff0c;手不离机&#xff0c;如果开发一个用在手机上的程序软件&#xff0c;那是多么的符合潮流&#xff0c;符合管理者和客户的理想。本次就是开发婚庆摄影小程序&#xff0c;有管理员&#…

knife4j springboot3使用

简介 在日常开发中&#xff0c;写接口文档是我们必不可少的&#xff0c;而Knife4j就是一个接口文档工具&#xff0c;可以看作是Swagger的升级版&#xff0c;但是界面比Swagger更好看&#xff0c;功能更丰富 使用 我使用的是springboot3.2.3 knife4j 4.3.0,knife4j 4.4版本有…

python[6]

类和对象 面向对象编程–说白就是让对象干活 创建类&#xff1a;class 类名&#xff1a; 创建类对象 对象名 类名&#xff08;&#xff09; 构造方法 1、构造方法的名称是__init__ 2、构造方法的作用&#xff1f; 构建类对象的时候会自动运行 构建类对象的传参会传递给构造…

Linux:Jenkins:GitLab+Maven+Jenkins的部署

1.环境 我这里准备了三台centos7 1.用于部署gitlab 运行内存&#xff1a;6G 名字&#xff1a;Jenkins-GitLab 192.168.6.1 2.用于部署jenkins 运行内存&#xff1a;2G 名字&#xff1a;Jenkins-server 192.168.6.2 3.用于打包测试…

GO-ICP的使用(一)

一、代码下载以、修改以及使用 下载&#xff1a; 链接&#xff1a;yangjiaolong/Go-ICP: Implementation of the Go-ICP algorithm for globally optimal 3D pointset registration (github.com) 解压之后 &#xff1a; 首先visual studio项目&#xff0c;配置好PCL环境&…

【leetcode热题】不同的子序列

给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 示例 1&#xff1a; 输入&#xff1a;s "rabbbit", t "rabbit" 输出&#xff1a;3 解释&#xff1a; 如下所示, 有 3 种可以从 s 中…

Ps:明度直方图

明度 Luminosity直方图显示了图像中各个亮度级别的像素分布情况。 与 RGB 直方图不同&#xff0c;“明度”直方图专注于图像的亮度信息&#xff0c;而不是单独的颜色信息。 在“直方图”面板的通道中选择“明度”。 “明度”直方图提供了一种量化的方式来理解图像的整体明暗结构…

数字滚动实现

介绍 vue-countup-v3 插件是一个基于 Vue3 的数字动画插件&#xff0c;用于在网站或应用程序中创建带有数字动画效果的计数器。通过该插件&#xff0c;我们可以轻松地实现数字的递增或递减动画&#xff0c;并自定义其样式和动画效果。该插件可以用于许多场景&#xff0c;例如展…

MYSQL安装及卸载

目录 一、下载 二、解压 三、配置 1. 添加环境变量 2. 初始化MySQL 3. 注册MySQL服务 4. 启动MySQL服务 5. 修改默认账户密码 四、登录MySQL 五、卸载MySQL 一、下载 点开下面的链接&#xff1a;MySQL :: Download MySQL Community Server 点击Download 就可以下载对…

【深度学习目标检测】十八、基于深度学习的人脸检测系统-含GUI和源码(python,yolov8)

人脸检测是计算机视觉中的一个重要方向&#xff0c;也是一个和人们生活息息相关的研究方向&#xff0c;因为人脸是人最重要的外貌特征。人脸检测技术的重要性主要体现在以下几个方面&#xff1a; 人脸识别与安全&#xff1a;人脸检测是人脸识别系统的一个关键部分&#xff0c;是…

人工智能 — 特征选择、特征提取、PCA

目录 一、特征选择1、定义2、原因3、做法4、生成过程5、停止条件 二、特征提取三、PCA 算法1、零均值化&#xff08;中心化&#xff09;2、方差3、协方差4、协方差矩阵5、对协方差矩阵求特征值、特征矩阵6、对特征值进行排序7、评价模型8、代码实现9、sklearn 库10、鸢尾花实例…

Flink join详解(含两类API及coGroup、connect详解)

Flink SQL支持对动态表进行复杂而灵活的连接操作。 为了处理不同的场景&#xff0c;需要多种查询语义&#xff0c;因此有几种不同类型的 Join。 默认情况下&#xff0c;joins 的顺序是没有优化的。表的 join 顺序是在 FROM 从句指定的。可以通过把更新频率最低的表放在第一个、…