C++/Qt读写ini文件

news/2024/11/16 20:48:43/

今天介绍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.ppmy.cn/news/1010137.html

相关文章

Apache RocketMQ 命令注入

漏洞简介 RocketMQ 5.1.0及以下版本&#xff0c;在一定条件下&#xff0c;存在远程命令执行风险。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露&#xff0c;缺乏权限验证&#xff0c;攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命令…

【新人指南】给新人软件开发工程师的干货建议

在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的成本。 这篇文章根据我多年的工作经验&#xff0c;给新人总结了一些建议&#xff0c;希望对你会有所帮助。 写好注释 没有注…

Cocos Creator的rigidBody.applyForce变成了滚动

序: 1、原因是因为没有调整摩擦系数physics-material 2、摩擦系数调整你要在你的节点 一个物理材料才会有的&#xff0c;教程没跳过去了所以没有 3、扩展阅读第一话&#xff1a;入行程序员的一波三折 最终效果&#xff1a; git录屏会卡&#xff0c;其实过程很平滑 正…

计算机毕设 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往…

Clash 意外退出后 chrome / google 谷歌 浏览器无法连接互联网

解决方案&#xff1a; 以管理员模式打开命令行&#xff0c;输入&#xff1a;netsh winsock reset &#xff0c;然后重启电脑 如果还不行的话&#xff0c; 在 chromevs中选中 设置>隐私和安全>安全>使用安全 dns> 使用您当前的服务提供商 即可

torchvision.datasets数据加载失败

torchvision.datasets数据加载失败 如何使用torchvision.datasets进行自动下载数据失败&#xff0c;可以使用手动下载数据 Ctrl点击可以进入相关包文件&#xff0c;查找下载地址&#xff1a;https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 手动下载之后解压&#x…

数字图像处理 使用 GIST 图像描述符

一、简述 GIST描述符是一种用于场景识别的全局图像特征,它能够有效地描述图像的空间结构信息。GIST描述符最初是在这篇论文中提出的:A Computational Approach to Edge Detection 1998。 图像的 GIST 描述符可以通过分析空间频率和方向来捕获。直观上,GIST 总结了图像不同部分…

注解 @JsonFormat 与 @DateTimeFormat 的使用

文章目录 JsonFormat (双端互传)DateTimeFormat &#xff08;前端传后端日期格式转化&#xff09;情况一 前端是时间组件 <el-date-picker 或其他情况二 前端未设置组件 JsonFormat (双端互传) com.fasterxml.jackson.annotation.JsonFormat; 将字符串的时间转换成Date类型…