今天介绍C++/Qt读写ini文件,ini文件一般是作为配置文件来使用,比如一些程序的一些默认参数会写在一个ini文件中,程序运行时会进行对应的参数读取,详细可以查看百度ini文件的介绍。https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=ge_alahttps://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对象,然后设置编码SetUnicode,LoadFile打开文件,SetValue和GetValue进行读写,具体的还有GetBoolValue、SetBoolValue、GetLongValue、SetLongValue、GetDoubleValue、SetDoubleValue。写一个简单的例子,这是对应的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>
读写对应键值使用value和setValue方法 。
读文件示例:
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 帮助文档查看。