注:本章内容对于个人 非重点,后续如有需要深入学习需求需查阅其他资料。
01 INI文件操作
ini文件概述:
.ini文件是Initialization File的缩写,即初始化文件,是Windows的系统配置文件所采用的存储格式。
文件扩展名:配置文件名称.ini。比如项目中的配置文件是整个项目共用的,假设:数据库配置.ini。
(1)INI文件由节、键、值三个部分组成:
节:[section]
参数
(键=值)
name=value;
注意:分号表示(在分号后面的相关字符等信息,直到该行结尾都全部为注解内容)。
比如:
[sectionname]
[Keynames=values]
(2)Qt如何读取INI文件
在整个操作过程当中,Qt使用QSetting进行操作读写文件。
常用API函数:
QSetting::beginGroup:在INI文件中添加索引,根据索引读取相关对应的值。
QSetting::endGroup:将这个组重置,然后调用之前的相关状态。
QSetting::setValue:专门向INI文件写入数据信息,以键值对的形式写入对应的INI文件中,如果键值存在,直接覆盖。
QSetting::value:从INI文件读取信息返回键的值,如果这个键不存在,返回一个默认的值。
QSetting::Group:返回组名。
QSetting::beginWriteArray:将前缀添加到当前组,并且开始写入,大小为数组,根据写入的相关条目索引自动确定。
QSetting::beginReadArray:将前缀添加到当前组,并且从数组中读取返回整个数组的大小。
QSetting::endArray:不管是读还是写,都要通过该函数关闭所操作的数组。
QSetting::NativeFormat:当我们使用参数时候,NativeForm使用平台最合适的存储格式,在Windows系统中使用系统注册表,在Unix中使用INI文件的文本配置文件。
QSetting::IniFormat:存储在INI文件中进行设置。
QSetting::InvalidFormat:直接返回值。
Unix系统当中,NativeFormat/IniFormat(区别在于文件扩展名不一样:.conf/.ini)。
案例:读写INI文件
(1)创建Qt COnsole Application项目
(2)添加头文件
(3)添加源文件
(4)修改"wrinifile.h"文件
#ifndef WRINIFILE_H
#define WRINIFILE_H
void WriteIniFile(); //写配置文件
void ReadIniFile(); //读配置文件
void ReadIniFileIsKey(); //一次性读取文件
#endif // WRINIFILE_H
(5)修改"wrinifile.cpp"文件
#include "wrinifile.h"
#include <QSettings>
#include <QDebug>
void WriteIniFile() //写配置文件
{
//直接使用QSetting类读写INI文件
QSettings *ConfigWriteIniFiles = new QSettings("MySQLFiles.ini",QSettings::IniFormat);
//向INI文件中写入数据信息
ConfigWriteIniFiles->setValue("/database/ip","192.168.12.189"); //第一节的第一个参数
ConfigWriteIniFiles->setValue("/database/port","3308");
ConfigWriteIniFiles->setValue("/database/user","root");
ConfigWriteIniFiles->setValue("/database/password","123456");
ConfigWriteIniFiles->setValue("/notice/version","6.4");
ConfigWriteIniFiles->setValue("/notice/datetime","2024.07.11 22:06");
//向INI文件写入完成之后,删除指针
delete ConfigWriteIniFiles;
}
void ReadIniFile() //读配置文件
{
//直接使用QSetting类读INI文件
QSettings *ConfigReadIniFiles = new QSettings("MySQLFiles.ini",QSettings::IniFormat);
QString strip = ConfigReadIniFiles->value("database/ip").toString();
QString strport = ConfigReadIniFiles->value("database/port").toString();
QString struser = ConfigReadIniFiles->value("database/user").toString();
QString strpassword = ConfigReadIniFiles->value("database/password").toString();
QString strversion = ConfigReadIniFiles->value("/notice/version").toString();
QString strdatetime = ConfigReadIniFiles->value("/notice/datetime").toString();
//输出读取配置文件的参数信息
qDebug()<<"读取INI配置文件参数选项如下:";
qDebug()<<"MySQL IP地址:"<<strip.toUtf8().data();
qDebug()<<"数据库端口:"<<strport.toUtf8().data();
qDebug()<<"数据库用户名:"<<struser.toUtf8().data();
qDebug()<<"数据库密码:"<<strpassword.toUtf8().data();
qDebug()<<"数据库版本:"<<strversion.toUtf8().data();
qDebug()<<"数据库时间:"<<strdatetime.toUtf8().data();
}
void ReadIniFileIsKey() //一次性读取文件
{
QSettings setting(".MySQLFiles.ini",QSettings::IniFormat);
foreach(QString key,setting.allKeys())
{
qDebug()<<key.toUtf8().data()<<","<<setting.value(key).toString().toUtf8().data();
}
}
(6)修改"main.cpp"文件
#include <QCoreApplication>
#include "wrinifile.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// WriteIniFile();
// ReadIniFile(); //调用读取配置文件
ReadIniFileIsKey(); //整体读取INI文件
return a.exec();
}
02 JSON文件操作
001 json文件概述
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于阅读和编写,可以在多种语言之间进行数据交换。同时也易于机器解析和生成,并有效地提升网络传输效率。采用完全独立于编程语言地文本格式来存储和表示数据。简洁和清晰地层次结构使得JSON成为理想地数据交换语言。
JSON文件扩展名是.json。
JSON使用场景:配置文件、序列化、定义接口等等。
JSON是存储和交换文本信息的语法,类似XML,比XML更小、更快、更加容易解析。
002 json语法规则
JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。
JSON是一个序列化的对象或数组。
(1)六个构造字符:
构造字符 | 符号 | 含义 |
begin-array=ws %x5B ws; | [ | 左方括号 |
begin-object=ws %x7B ws; | { | 左大括号 |
end-array=ws %x5D ws; | ] | 右方括号 |
end-object=ws %x7D ws; | } | 右大括号 |
name-separator=ws %x3A ws; | : | 冒号 |
value-separator=ws %x2C ws; | , | 逗号 |
(2)在这六个构造字符的前或后允许存在无意义的空白符(ws):
符号 | 含义 |
ws = *(%x20 / | 空间 |
%x09 / | 水平标签 |
%x0A / | 换行 |
%x0D) | 回程 |
(3)JSON的值:
1)JSON的构成: ws 值 ws。
2)值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。
①对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如:
{"name": "John Doe", "age": 18, "address":
{"country" : "china", "zip-code": "10000"}}
JSON中的对象可以包含多个键值对,并且有数组结构,该语言正是一次实现过程内容的描述。
②数组是由方括号括起来的一组值构成,如:
[3, 1, 4, 1, 5, 9, 2, 6]
③字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
④数字也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
一些合法的JSON的实例:
{"a": 1, "b": [1, 2, 3]}
[1, 2, "3", {"a": 4}]
3.14
"plain_text"
003 json与js对象的关系
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
004 json和js对象互转
要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}
要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'
005 常用类型
任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
对象:对象在 JS 中是使用花括号包裹 {} 起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
数组:数组在 JS 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。
006 基础示例分析
简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式,例如在 PHP 中,可以将 JSON 还原为数组或者一个基本对象。在用到AJAX时,如果需要用到数组传值,这时就需要用JSON将数组转化为字符串。
0001 表示对象
对象是一个无序的“‘名称/值’对”集合。一个对象以{左括号开始,}右括号结束。每个“名称”后跟一个:冒号;“‘名称/值’ 对”之间使用,逗号分隔。
{"firstName": "Brett", "lastName": "McLaughlin"}
0002 表示数组
和普通的 JS 数组一样,JSON 表示数组的方式也是使用方括号 []。
{
"people":[
{
"firstName": "Brett",
"lastName":"McLaughlin"
},
{
"firstName":"Jason",
"lastName":"Hunter"
}
]
}
在这个示例中,只有一个名为 people的变量,值是包含两个条目的数组,每个条目是一个人的记录,其中包含名和姓。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示更过多的值(每个值包含多个记录)。
在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,也可以使用不同方式表示同一事物。
如前面所说,除了对象和数组,你也可以简单地使用字符串或者数字等来存储简单的数据,但这样并没有多大意义。
案例:
(1)创建"Dialog"文件(带ui文件)
(2)编辑UI文件
(3)修改头文件
#ifndef QJSONOPER_H
#define QJSONOPER_H
#include <QDialog>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class qjsonoper; }
QT_END_NAMESPACE
class qjsonoper : public QDialog
{
Q_OBJECT
public:
qjsonoper(QWidget *parent = nullptr);
~qjsonoper();
private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked();
private:
Ui::qjsonoper *ui;
};
#endif // QJSONOPER_H
(4)修改源文件
#include "qjsonoper.h"
#include "ui_qjsonoper.h"
#include <QMessageBox>
#include <QDebug>
#include <QFile> // 文件读写
#include <QJsonDocument> // JSON文档
#include <QJsonObject> // JSON对象
#include <QJsonParseError> // JSON异常捕捉
qjsonoper::qjsonoper(QWidget *parent)
: QDialog(parent)
, ui(new Ui::qjsonoper)
{
ui->setupUi(this);
}
qjsonoper::~qjsonoper()
{
delete ui;
}
// 将数据信息-->写入JSON文件
void qjsonoper::on_pushButton_2_clicked()
{
// 1:创建json对象
QJsonObject mysqinfo;
mysqinfo.insert("ip","192.168.0.125");
mysqinfo.insert("port",3308);
mysqinfo.insert("user","root");
mysqinfo.insert("password","123456");
QJsonObject jsonifo;
jsonifo.insert("code",1);
jsonifo.insert("dbmsg","MySQL数据库配置参数");
jsonifo.insert("data",mysqinfo); // 将json对象作为Json对象插入的数据值
// 2: 创建JSON文档
QJsonDocument jsondoc;
jsondoc.setObject(jsonifo);
// 3: 创建文件
QFile qfiles("./databasejsonfiles.json");
if(qfiles.open(QIODevice::WriteOnly))
{
qfiles.write(jsondoc.toJson());
qfiles.close();
qDebug()<<"恭喜你,json数据文件写入成功!";
}
QMessageBox::information(this,"写入成功","恭喜你,json数据文件写入成功!");
}
void qjsonoper::on_pushButton_clicked()
{
QString strjson;
QString strmsg;
QFile qfiles("./databasejsonfiles.json");
if(qfiles.open(QIODevice::ReadOnly))
{
strjson=qfiles.readAll();
qfiles.close();
}
QJsonParseError jsonerror; // 返回JSON解析错误的时候,报告错误信息
QJsonDocument jsondoc=QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);
QString strtemp;
if(!jsondoc.isEmpty() && (jsonerror.error==QJsonParseError::NoError))
{
// 只要jsondoc不为空,和jsonerror没有错误
// 将它转换为JSON对象
QJsonObject json=jsondoc.object();
QJsonValue code=json.value("code");
QJsonValue data=json.value("data");
// 检查数据
if(code.isUndefined() || code.toDouble()!=1 || data.isUndefined() || !data.isObject())
{
qDebug()<<"转换JSON数据错误,请重新检查?";
QMessageBox::critical(this,"错误","转换JSON数据错误,请重新检查?");
exit(100);
}
// 如果没有错误,读取data数据信息
QJsonObject databaseinfo=data.toObject();
QJsonValue dbip=databaseinfo.value("ip");
QJsonValue dbport=databaseinfo.value("port");
QJsonValue dbuser=databaseinfo.value("user");
QJsonValue dbpassword=databaseinfo.value("password");
// 检查接口是否正确
if(dbip.isUndefined()||
dbport.isUndefined()||
dbuser.isUndefined()||
dbpassword.isUndefined())
{
qDebug()<<"接口错误,请重新检查?";
QMessageBox::critical(this,"错误","接口错误,请重新检查?");
exit(100);
}
QString strip=dbip.toString();
int iport=dbport.toInt();
QString struser=dbuser.toString();
QString strpassword=dbpassword.toString();
// 判断每一项配置是否为空
if(strip.isEmpty() || struser.isEmpty() || strpassword.isEmpty())
{
qDebug()<<"此数据项不能为空,请重新检查?";
QMessageBox::critical(this,"错误","此数据项不能为空,请重新检查?");
exit(100);
}
qDebug()<<"数据库IP地址:"<<strip;
qDebug()<<"数据库端口:"<<iport;
qDebug()<<"数据库用户:"<<struser;
qDebug()<<"数据库密码:"<<strpassword;
// 拼接字符串
strmsg+="【JSON配置参数】";
strmsg+="\n数据库IP地址:"+strip;
strmsg+="\n数据库端口:"+QString::number(iport,10);
strmsg+="\n数据库用户:"+struser;
strmsg+="\n数据库密码:"+strpassword;
}
QMessageBox::information(this,"成功",strmsg,QMessageBox::Yes);
}
(5)结果演示
03 XML文件操作
XML文件基础:
可扩展标记语言(Extensible Markup Language,XML),标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是标准通用标记语言,可扩展性良好,内容与形式分离,遵循严格的语法要求,保值性良好等优点。
XML语言可以从Html中分离数据,能够在html文件之外将数据存储在XML文档之中,开发者将精力投入到html文件布局中,并且确保数据在改动时不会导致html文件也需要改动。
XML文件可用于交换数据,共享数据,充分利用数据。XML同软件硬件无任何关系,数据可以被很多用户或设备使用,不仅仅局限于html浏览格式。
XML可用于创建新的语言,主要用于基于Web应用。
XML文档中大小写是有区别的,大小写表示不同的标记,在写元素的时候,尽可能保证大小写一致。XML文档有且仅有一个根元素,属性值使用引号,所有标记必须有相应的结束标记,所有的空标记(标记之间没有内容的标记)也必须被关闭。
推荐课程: