C++/Qt读写ini文件

今天介绍C++/Qt读写ini文件,ini文件一般是作为配置文件来使用,比如一些程序的一些默认参数会写在一个ini文件中,程序运行时会进行对应的参数读取,详细可以查看百度ini文件的介绍。https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=ge_alaicon-default.png?t=N6B9https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=ge_ala

C++

C++读写ini文件有很多种方法可以选择自己封装或者借助平台方法或者借助第三方库。自己封装的话可以参考这位博主写的文章C++ 读取写入INI文件,借助windows平台的函数可以参考这位博主写的文件C++ini文件操作,如果要使用第三方库来进行ini文件读写操作的话可以使用inih或者SimpleIni这两个第三方库,这两个的源码都可以在github上进行下载都是开源的。对应下载github地址:inih github地址、SimpleIni github地址。inih貌似只能读取ini文件不能修改,而SimpleIni文件读写都可以,下面就以SimpleIni为例。

首先github上下载源码文件进行解压:

可以看到有源码还有说明文件,要使用直接头文件包含“SimpleIni.h”就行了。SimpleIni先要实例化对应对象CSimpleIni对象,然后设置编码SetUnicodeLoadFile打开文件,SetValueGetValue进行读写,具体的还有GetBoolValueSetBoolValueGetLongValueSetLongValueGetDoubleValueSetDoubleValue。写一个简单的例子,这是对应的ini文件:

读取该文件示例代码:

 

#include <iostream>
#include <windows.h>using namespace std;#include "SimpleIni.h"
void Test() {CSimpleIniA ini;ini.SetUnicode();if (ini.LoadFile("example.ini") >= 0) {const char* Name = ini.GetValue("UserInfo", "Name");const char* Ip = ini.GetValue("UserInfo", "Ip");bool BoolValue = ini.GetBoolValue("UserInfo", "IsSigned");long LongValue = ini.GetLongValue("UserInfo", "Weight");double DoubleValue = ini.GetDoubleValue("UserInfo", "Height");cout << "Name=" << Name << endl;cout << "Ip=" << Ip << endl;if (BoolValue)cout << "IsSigned=true" << endl;else cout << "IsSigned=false" << endl;cout << "Weight=" << LongValue << endl;cout << "Height=" << DoubleValue << endl;}
}int main() {Test();return 0;
}

 运行结果:

 下面是写入示例:

void Write() {CSimpleIniA ini;ini.SetUnicode();if (ini.LoadFile("example.ini") >= 0) {const char* Name = "User0001";const char* Ip = "192.168.1.2";bool BoolValue = false;long LongValue = 191;double DoubleValue = 188.99;ini.SetValue("UserInfo", "Name", Name);ini.SetValue("UserInfo", "Ip", Ip);ini.SetBoolValue("UserInfo", "IsSigned", BoolValue);ini.SetLongValue("UserInfo", "Weight", LongValue);ini.SetDoubleValue("UserInfo", "Height", DoubleValue);ini.SaveFile("example.ini");}
}

 运行后查看对应ini文件:

 

另外还有一些方式 比如获取所有Section的方法GetAllSections和获取所有Key的方法GetAllKeys

void Get() {CSimpleIniA ini;ini.SetUnicode();if (ini.LoadFile("example.ini") >= 0) {cout << "sections" << endl;CSimpleIniA::TNamesDepend sections;ini.GetAllSections(sections);for (const auto &iter : sections) {cout << iter.pItem << endl;const CSimpleIniA::TKeyVal *pkeyVal = ini.GetSection(iter.pItem);if (nullptr != pkeyVal) {for (const auto &iter : *pkeyVal) {cout << iter.first.pItem << " = " << iter.second << endl;}}}cout << "keys" << endl;CSimpleIniA::TNamesDepend keys;ini.GetAllKeys("UserInfo", keys);for (const auto &iter : keys) {cout << iter.pItem << endl;}}
}

程序运行结果: 

 其他方法可以对应查看源码文件下的README.md文件,其中有相应介绍,这里不再赘述。

Qt

Qt读写对应的ini文件使用Qt自带的QSettings模块,使用只需要包含对应头文件:

#include <QSettings>

读写对应键值使用valuesetValue方法 。

读文件示例:

    QSettings setting("example.ini", QSettings::IniFormat);setting.beginGroup("UserInfo");qDebug()<<"Name="<<setting.value("Name").toString();qDebug()<<"Ip="<<setting.value("Ip").toString();qDebug()<<"IsSigned="<<setting.value("IsSigned").toBool();qDebug()<<"Weight="<<setting.value("Weight").toInt();qDebug()<<"Height="<<setting.value("Height").toDouble();setting.endGroup();

还是刚刚那个ini文件,程序打印输出:

 读文件需要注意了,如果ini文件中有中文比如:

打印显示是会乱码的:

需要使用setIniCodec设置一些编码 :

 QSettings setting("example.ini", QSettings::IniFormat);setting.setIniCodec("utf-8");setting.beginGroup("UserInfo");qDebug()<<"Name="<<setting.value("Name").toString();qDebug()<<"Ip="<<setting.value("Ip").toString();qDebug()<<"IsSigned="<<setting.value("IsSigned").toBool();qDebug()<<"Weight="<<setting.value("Weight").toInt();qDebug()<<"Height="<<setting.value("Height").toDouble();setting.endGroup();

 则可以正常显示ini中文:

 

写文件示例:

    QSettings setting("example.ini", QSettings::IniFormat);setting.beginGroup("UserInfo");setting.setValue("Name", "Qt001");setting.setValue("Ip", "192.168.11.12");setting.setValue("IsSigned", true);setting.setValue("Weight", 177);setting.setValue("Height", 192.11);setting.endGroup();

 运行查看对应ini文件发现已经修改:

对应的也有获取所有group(section)的方法childGroups和获取所有key的方法allKeys等其他一系列方法具体可以查看Qt Assistant 帮助文档查看。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis的简介,安装(Linux、Windows),配置文件的修改---详细介绍

Redis基础 Redis是一个基于内存的key-value结构数据库。 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热点商品、资讯、新闻)企业应用广泛 1、Redis入门 1.1、Redis简介 The open source, in-memory data store used by millions of developers as a …

福布斯发布2023云计算100强榜单,全球流程挖掘领导者Celonis排名17

近日&#xff0c;全球流程挖掘领导者Celonis入选福布斯2023 年云计算 100 强榜单&#xff0c;估值130亿美元&#xff0c;排名第17&#xff0c;Celonis已经是连续三年跻身榜单前20名。 本次榜单由福布斯与Bessemer Venture Partners和Salesforce Ventures联合发布&#xff0c;旨…

SpringBoot整合WebSocket实现定时任务消息推送

在平时项目开发中&#xff0c;肯定有很多小伙伴会需要实现定时向某个页面推送消息的功能&#xff0c;为了解决大家无从下手的问题&#xff0c;加哥今天展示一套简单的代码解决方案。 1.创建WebSocketConfig配置类 在这个类中注入ServerEndpointExporter&#xff0c;这个bean会…

putty使用记录

在官网下载并安装putty 一、SSH 二、FTP open 192.168.1.118 put -r C:\Users\Administrator\Desktop\test /opt/lanren312/test # 上传&#xff08;文件夹&#xff09; get -r /opt/lanren312/test C:\Users\Administrator\Desktop\test2 # 下载&#xff08;文件夹&#xff…

教你如何实现接口防刷

教你如何实现接口防刷 前言 我们在浏览网站后台的时候&#xff0c;假如我们频繁请求&#xff0c;那么网站会提示 “请勿重复提交” 的字样&#xff0c;那么这个功能究竟有什么用呢&#xff0c;又是如何实现的呢&#xff1f; 其实这就是接口防刷的一种处理方式&#xff0c;通…

【linux--->高级IO】

文章目录 [TOC](文章目录) 一、五种IO模型概念1.阻塞IO2.非阻塞IO3.信号驱动IO4.多路复用/多路转接IO5.异步IO 二、非阻塞IO之fcntl应用1.fcntl系统调用接口介绍2.用fcntl实现非阻塞IO 三、多路转接IO之select应用1.select接口介绍2.使用select实现多路转接IOselect的优缺点 四…

算法练习--链表相关

文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&…

JVM面试题

JVM理论 #JVM内存模型# Java内存模型&#xff08;JMM&#xff09;&#xff1f; Java的内存模型决定了线程间的通信方式&#xff0c;JMM的模型是由主存和工作内存构成&#xff0c;两个线程想要正常通信需要将工作内存中的变量刷到主存中&#xff0c;另一个线程才能正确读取得…

SpringBoot 升级内嵌Tomcat

SpringBoot 更新 Tomcat 最近公司的一个老项目需要升级下Tomcat&#xff0c;由于这个项目我完全没有参与&#xff0c;所以一开始我以为是一个老的Tomcat项目&#xff0c;升级它的Tomcat依赖或者是Tomcat容器镜像&#xff0c;后面发现是一个SpringBoot项目&#xff0c;升级的是…

基于SpringBoot+LayUI的宿舍管理系统 001

项目简介 源码来源于网络&#xff0c;项目文档仅用于参考&#xff0c;请自行二次完善哦。 系统以MySQL 8.0.23为数据库&#xff0c;在Spring Boot SpringMVC MyBatis Layui框架下基于B/S架构设计开发而成。 系统中的用户分为三类&#xff0c;分别为学生、宿管、后勤。这三…

SQL ASNI where from group order 顺序 where和having,SQL底层执行原理

SQL语句执行顺序&#xff1a; from–>where–>group by -->having — >select --> order 第一步&#xff1a;from语句&#xff0c;选择要操作的表。 第二步&#xff1a;where语句&#xff0c;在from后的表中设置筛选条件&#xff0c;筛选出符合条件的记录。 …

STM32--EXTI外部中断

前文回顾---STM32--GPIO 相关回顾--有关中断系统简介 目录 STM32中断 NVIC EXTI外部中断 AFIO EXTI框图 旋转编码器简介 对射式红外传感器工程 代码&#xff1a; 旋转编码器工程 代码&#xff1a; STM32中断 先说一下基本原理&#xff1a; 1.中断请求发生&#xff1a…

Profibus-DP转modbus RTU网关modbus rtu和tcp的区别

捷米JM-DPM-RTU网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;EH流量计、倍福编码器等&#xff09;接入到Modbus网络中&#xff1b;通过增加DP/PA耦合器&#xff0c;也可将Profibus PA从站接入…

MyBatis操作数据库常见用法总结2

文章目录 1.动态SQL使用什么是动态sql为什么用动态sql标签拼接标签拼接标签拼接标签拼接标签拼接 补充1&#xff1a;resultType和resultMap补充2&#xff1a;后端开发中单元测试工具使用&#xff08;Junit框架&#xff09; 1.动态SQL使用 以insert标签为例 什么是动态sql 是…

golang协程池(goroutine池)ants库实践

golang中goroutine由运行时管理&#xff0c;使用go关键字就可以方便快捷的创建一个goroutine,受限于服务器硬件内存大小&#xff0c;如果不对goroutine数量进行限制&#xff0c;会出现Out of Memory错误。但是goroutine泄漏引发的血案&#xff0c;想必各位gopher都经历过&#…

易服客工作室:初学者的终极WordPress SEO教程(入门指导)

改善WordPress SEO对于获得更多网站流量至关重要。可悲的是&#xff0c;大多数WordPress SEO指南对于新用户来说太技术性了。 如果您认真考虑增加网站流量&#xff0c;则需要注意WordPress SEO最佳做法。 在本WordPress SEO教程中&#xff0c;我们将分享WordPress SEO的主要技…

创建Springboot+vue3项目

项目概述创建springboot项目加入mybatis-plus支持1.加入依赖代码2.创建数据库实例3.yml文件的配置4.编写测试代码5.测试结果 创建vue项目报错错误一错误二错误三 项目概述 后端&#xff1a;Springboot、mybatis-plus、java 前端&#xff1a;nodejs、vue脚手架、element-ui 数据…

【Spring Boot 源码学习】自动装配流程源码解析(上)

自动装配流程源码解析&#xff08;上&#xff09; 引言往期内容主要内容1. 自动配置开关2. 加载自动配置组件3. 自动配置组件去重 总结 引言 上篇博文&#xff0c;笔者带大家从整体上了解了AutoConfigurationImportSelector 自动装配逻辑的核心功能及流程&#xff0c;由于篇幅…

HCIP-linux和kvm(ks配置文件自动化安装及console连虚拟机有问题)

1、linux linux安装教程参考&#xff0c;https://blog.51cto.com/cloudcs/5245337 yum源配置 本地yum源配置&#xff1a; 8版本配置&#xff1a;将光盘iso挂载到某个目录&#xff0c;/dev/cdrom是/dev/sr0软链接&#xff0c;# mount /dev/cdrom /mnt&#xff0c;# ls /mnt Ap…

C#导入数据使用Task异步处理耗时任务

C#多线程中&#xff0c;我们可以使用async和await来异步处理耗时任务。 现在我们打开一个Excel表格&#xff0c;将Excel表格的每一行数据进行处理&#xff0c;并存储到数据库中 新建Windows应用程序DataImportDemo&#xff0c;.net framework 4.6.1 将默认的Form1重命名为Fo…