C++/Qt读写ini文件

news2025/1/19 3:01:35

今天介绍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.coloradmin.cn/o/843239.html

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

相关文章

Linux命令200例:sed对文本进行修改、替换和删除等操作的强大工具(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

Framework才是Android 开发的热门技术~

相信大家都有感觉到今年的市场竞争的激烈&#xff0c;投出简历并不像往年一样立马就有回应&#xff0c;大多是这种情况&#xff1a;投出简历没有停歇&#xff0c;状态却是70%未读&#xff0c;30%已读。 这种情况并不是说市场落寞了&#xff0c;不招人了&#xff0c;而是经过了…

Windows下调试UEFI程序:Visual Studio调试

以edk2\MdeModulePkg\Application\HelloWorld这个项目作为调试目标。 1. 使用VS2017建立Makefile工程 VS2017, 新建 project&#xff0c;取名X64dbg_vs。 Visual C > Other > Makefile Project, 注意项目路径为HelloWord程序路径。 随便填写config中的字符串&#xff…

决策树和随机森林对比

1.用accuracy来对比 # -*-coding:utf-8-*-""" accuracy来对比决策树和随机森林 """ from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine#(178, 13…

C++ STL vector

目录 一.认识vector 二.vector的使用 1.vector的构造函数 2.vector的迭代器 2.1 begin&#xff08;&#xff09;&#xff0c;end&#xff08;&#xff09; 2.2 rbegin&#xff08;&#xff09;&#xff0c;rend&#xff08;&#xff09; 2.3 迭代器初始化对象 3. vector…

宝塔Linux面板点击SSL闪退打不开?怎么解决?

宝塔Linux面板点击SSL证书闪退如何解决&#xff1f;旧版本的宝塔Linux面板确实存在这种情况&#xff0c;如何解决&#xff1f;升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法&#xff1a; 宝塔面板点击SSL证书闪退解决方法 问题&#xff1a;宝塔Linux面板…

【脚踢数据结构】链表(1)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

【果树农药喷洒机器人】Part3:变量喷药系统工作原理

文章目录 一、变量喷药系统工作原理二、液压通路设计与控制系统封装2.1液压通路设计2.2 控制系统总体封装 三、喷头测定与布置实验3.1喷雾角度测定实验3.2确定喷头布置间距 一、变量喷药系统工作原理 果树喷药机器人通过现代测量技术获取果树冠层参数信息&#xff0c;并对获取…

【Linux:线程池】

文章目录 1 线程池概念2 第一个版本的线程池3 第二个版本的线程池4 第三个版本的线程池5 STL中的容器以及智能指针的线程安全问题6 其他常见的各种锁7 读者写者问题(了解) 1 线程池概念 一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而…

16-2_Qt 5.9 C++开发指南_使用样式表Qss自定义界面

进行本篇介绍学习前&#xff0c;请先参考链接01_1_Qt工程实践_Qt样式表Qss&#xff0c;后再结合本篇进行融合学习如何使用样式表定义界面。 文章目录 1. Qt样式表2. Qt样式表句法2.1 一般句法格式2.2 选择器 (selector)2.3 子控件&#xff08;sub-controls&#xff09;2.4 伪状…

neo4j的CQL命令实例演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

vim学习笔记(致敬vim作者)

vim cheat sheet 30. vim 删除大法 vim 删除某个字符之后改行的其他的字符&#xff1f;删除某行之后的其他行&#xff1f;删除某个字符之后的其他字符&#xff1f;【1】删除单个字符&#xff1f; 跳到要删除的字符位置 按下d键然后按下shift 4键 【2】删除某行之后的其他行…

List list=new ArrayList()抛出的ArrayIndexOutOfBoundsException异常

1.应用场景&#xff0c;今天生产日志监控到一下ArrayList 进行add 异常&#xff0c;具体日志如下&#xff1a; eptionHandler.handler(178): TXXYBUSSINESS|执行异常 java.util.concurrent.CompletionException: java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bo…

激活函数总结(一):ReLU及其变体

激活函数介绍&#xff08;一&#xff09; 1 引言2 常用激活函数介绍2.1 Sigmoid激活函数2.2 Tanh激活函数2.3 ReLU激活函数2.4 Leaky ReLU激活函数2.5 Parametric ReLU&#xff08;PReLU&#xff09;激活函数2.6 Swish激活函数 3. 总结 介绍的激活函数都在目录中有所展示&#…

VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

DROP USER c##xyt CASCADE > ORA-01940: 无法删除当前连接的用户

多创建了一个用户&#xff0c;想要给它删除掉 一 上执行过程&#xff0c;确实删除成功了 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing optionsSQL> DR…

用excel格式书写的接口用例执行脚本

创建测试用例和测试结果集文件夹&#xff1a; excel编写的接口测试用例如下&#xff1a; 1 encoding 响应的编码格式。所测项目大部分是utf-8&#xff0c;有一个特殊项目是utf-8-sig 2 params 对应requests的params 3 data&#xff0c;对应requests的data 有些参数是动态的&a…

C#,数值计算——查找等价类(Find equivalence classes)的计算方法及其源程序

1 等价类的定义 2 Examples 3 Partitions 4 C#源代码 using System; namespace Legalsoft.Truffer { /// <summary> /// Find equivalence classes /// </summary> public class EClass { public EClass() { } pub…

有没有好用的在线画图工具推荐?

绘画是设计师最常见的工作之一&#xff0c;设计师对在线绘画工具的要求越来越高&#xff0c;市场上也出现了各种在线绘画工具&#xff0c;让设计师不知道如何选择高质量的在线绘画工具&#xff0c;一个好的在线绘画工具不仅可以让你轻松绘画&#xff0c;而且可以让你的工作效率…

android studio内存分析之Memory profiler的使用

目录 Android Studio中内存分析工具Memory profiler的使用1. 打开Memory Profiler2. 工具使用3. 内存选项说明4. 内存性能分析器概览5. 内存计算方式6. 查看内存分配7. 捕获java/kotlin方式查看内存分配8. 堆转储文件导入和导出 内存性能分析器中的泄漏检测 Android Studio中内…