文章目录

  • 前言
  • 一、XML文件
  • 二、INI文件
  • 三、JSON文件
  • 四、示例代码及文件内容
  • 五、下载链接
  • 总结

前言

在项目开发过程中,发现经常遇见一些比如XML、INI、JSON等文件的读写,这里对这些文件进行整理和汇总,并展示一个简单的demo来实现上述文件的读写,以便大家学习,如有错误之处,欢迎大家批评指正。

项目效果


提示:以下是本篇文章正文内容,下面案例可供参考

一、XML文件

XML是可扩展标记语言,是一种通用的文本格式,被广泛运用于数据交换和数据存储,也可以用作配置文件。

在Qt中有三种方式来进行xml文件的读取:
1.使用XML流,读:QXmlStreamReader 写:QXmlStreamWriter
2.使用DOM读写
3.SAX为XML解析器提供了一个基于事件的标准接口
其中本文示例中使用的是第一种方式来进行读写,需要包含以下头文件,具体实现方式可看下文完整代码

//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>

二、INI文件

INI文件即初始化文件,通常存放的是一个程序的初始化信息,常用来做配置文件,其结构比较简单,由节、键、值组成,比较容易操作。

在Qt中可以使用QSettings类来进行ini文件的读写,需要包含以下头文件,具体实现方式可看下文完整代码

//ini
#include <QSettings>

三、JSON文件

JSON是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人的编写和阅读,也易于机器解析,json 文件由对象和数组组成。

本文的demo中读写的json文件比较简单,只有对象,但是在使用到数组的情况下需要包含以下头文件,具体实现方式可看下文完整代码

//json
#include <QJsonObject>   //对象
#include <QJsonArray>    //数组
#include <QJsonDocument>

四、示例代码及文件内容

1.widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMessageBox>
#include <QDebug>//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>//ini
#include <QSettings>//json
#include <QJsonObject>
#include <QJsonDocument>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEtypedef struct person
{QString name;QString gender;int age;double height;double weight;
}PersonData;class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void xmlFlieRead();bool xmlFileWrite();void iniFileRead();bool iniFileWrite();void jsonFileRead();bool jsonFileWrite();void setFileValue(QString fileType);void showFileValue(QString fileType);private slots:void on_pb_xmlRead_clicked();void on_pb_xmlWrite_clicked();void on_pb_iniRead_clicked();void on_pb_iniWrite_clicked();void on_pb_jsonRead_clicked();void on_pb_jsonWrite_clicked();private:Ui::Widget *ui;PersonData xmlData;PersonData iniData;PersonData jsonData;};
#endif // WIDGET_H

2.widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->xmlFlieRead();   //初始化读取xml文件
}Widget::~Widget()
{delete ui;
}void Widget::xmlFlieRead()
{QString xmlFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/xmlFile.xml";QFile file(xmlFile);if(!file.open(QFile::ReadOnly | QFile::Text)){QMessageBox::warning(this,"警告","xml文件打开失败!");return;}QXmlStreamReader xmlRead;xmlRead.setDevice(&file);if(xmlRead.readNextStartElement())   //读取root{if(xmlRead.name().toString() == "root"){if(xmlRead.readNextStartElement())   //读取config{if(xmlRead.name().toString() == "config"){while(xmlRead.readNextStartElement())   //循环读取Item{if(xmlRead.name().toString() == "Item"){QXmlStreamAttributes attributes = xmlRead.attributes();if(attributes.hasAttribute("Name")){QString s_name = attributes.value("Name").toString();//qDebug()<<"s_name:"<<s_name;if(s_name == "name"){xmlData.name = xmlRead.readElementText();}else if(s_name == "gender"){xmlData.gender = xmlRead.readElementText();}else if(s_name == "age"){xmlData.age = xmlRead.readElementText().toInt();}else if(s_name == "height"){xmlData.height = xmlRead.readElementText().toDouble();}else if(s_name == "weight"){xmlData.weight = xmlRead.readElementText().toDouble();}else{qDebug()<<"readItem error";xmlRead.readNextStartElement();}}}}}}}}//更新界面showFileValue("xml");
}bool Widget::xmlFileWrite()
{QString xmlFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/xmlFile.xml";QFile file(xmlFile);if(!file.open(QFile::WriteOnly | QFile::Text | QFile :: Truncate)){return false;}QXmlStreamWriter xmlWrite(&file);xmlWrite.setAutoFormatting(true);xmlWrite.writeStartDocument("1.0",true);xmlWrite.writeStartElement("root");xmlWrite.writeStartElement("config");xmlWrite.writeAttribute("filename","xmlFile.xml");xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","name");xmlWrite.writeAttribute("Type","string");xmlWrite.writeAttribute("Note","姓名");xmlWrite.writeCharacters(xmlData.name);xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","gender");xmlWrite.writeAttribute("Type","string");xmlWrite.writeAttribute("Note","性别");xmlWrite.writeCharacters(xmlData.gender);xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","age");xmlWrite.writeAttribute("Type","int");xmlWrite.writeAttribute("Note","年龄");xmlWrite.writeCharacters(QString::number(xmlData.age));xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","height");xmlWrite.writeAttribute("Type","double");xmlWrite.writeAttribute("Note","身高");xmlWrite.writeCharacters(QString::number(xmlData.height));xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","weight");xmlWrite.writeAttribute("Type","double");xmlWrite.writeAttribute("Note","体重");xmlWrite.writeCharacters(QString::number(xmlData.weight));xmlWrite.writeEndElement();xmlWrite.writeEndElement();    //config结束xmlWrite.writeEndElement();    //root结束xmlWrite.writeEndDocument();   //Document结束file.close();return true;
}void Widget::iniFileRead()
{QString iniFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/iniFile.ini";QSettings iniRead(iniFile,QSettings::IniFormat);iniRead.setIniCodec("UTF-8");   //注意编码iniRead.beginGroup("VALUE");iniData.name = iniRead.value("name").toString();iniData.gender = iniRead.value("gender").toString();iniData.age = iniRead.value("age").toInt();iniData.height = iniRead.value("height").toDouble();iniData.weight = iniRead.value("weight").toDouble();iniRead.endGroup();//更新界面showFileValue("ini");
}bool Widget::iniFileWrite()
{QString iniFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/iniFile.ini";QSettings iniWrite(iniFile,QSettings::IniFormat);iniWrite.setIniCodec("UTF-8");   //注意编码,解决中文字符乱码iniWrite.beginGroup("VALUE");iniWrite.setValue("name",iniData.name);iniWrite.setValue("gender",iniData.gender);iniWrite.setValue("age",iniData.age);iniWrite.setValue("height",iniData.height);iniWrite.setValue("weight",iniData.weight);iniWrite.endGroup();return true;
}void Widget::jsonFileRead()
{QString jsonFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/jsonFile.json";QFile file(jsonFile);if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"警告","json文件打开失败!");return;}QByteArray data(file.readAll());file.close();QJsonParseError jError;QJsonDocument jDoc = QJsonDocument::fromJson(data,&jError);if(jError.error != QJsonParseError::NoError){QMessageBox::critical(this,"错误","json文件错误!");return;}QJsonObject mainObject = jDoc.object();{jsonData.name = mainObject["name"].toString();jsonData.gender = mainObject["gender"].toString();jsonData.age = mainObject["age"].toInt();jsonData.height = mainObject["height"].toDouble();jsonData.weight = mainObject["weight"].toDouble();}//更新界面showFileValue("json");
}bool Widget::jsonFileWrite()
{QJsonObject mainObject;   //读写比较复杂的json文件,可以使用大括号来方便区分{mainObject.insert("name",jsonData.name);mainObject.insert("gender",jsonData.gender);mainObject.insert("age",jsonData.age);mainObject.insert("height",jsonData.height);mainObject.insert("weight",jsonData.weight);}QJsonDocument jDoc(mainObject);QString jsonFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/jsonFile.json";QFile file(jsonFile);if(!file.open(QIODevice::WriteOnly)){return false;}QByteArray data(jDoc.toJson());file.write(data);file.close();return true;
}void Widget::setFileValue(QString fileType)
{if(fileType == "xml"){xmlData.name = ui->le_name->text();xmlData.gender = ui->cb_gender->currentText();xmlData.age = ui->le_age->text().toInt();xmlData.height = ui->le_height->text().toDouble();xmlData.weight = ui->le_weight->text().toDouble();}else if(fileType == "ini"){iniData.name = ui->le_name->text();iniData.gender = ui->cb_gender->currentText();iniData.age = ui->le_age->text().toInt();iniData.height = ui->le_height->text().toDouble();iniData.weight = ui->le_weight->text().toDouble();}else if(fileType == "json"){jsonData.name = ui->le_name->text();jsonData.gender = ui->cb_gender->currentText();jsonData.age = ui->le_age->text().toInt();jsonData.height = ui->le_height->text().toDouble();jsonData.weight = ui->le_weight->text().toDouble();}
}void Widget::showFileValue(QString fileType)
{if(fileType == "xml"){ui->le_name->setText(xmlData.name);if(xmlData.gender == "男"){ui->cb_gender->setCurrentIndex(0);}else if(xmlData.gender == "女"){ui->cb_gender->setCurrentIndex(1);}else{ui->cb_gender->setCurrentIndex(0);}ui->le_age->setText(QString::number(xmlData.age));ui->le_height->setText(QString::number(xmlData.height));ui->le_weight->setText(QString::number(xmlData.weight));}else if(fileType == "ini"){ui->le_name->setText(iniData.name);if(iniData.gender == "男"){ui->cb_gender->setCurrentIndex(0);}else{ui->cb_gender->setCurrentIndex(1);}ui->le_age->setText(QString::number(iniData.age));ui->le_height->setText(QString::number(iniData.height));ui->le_weight->setText(QString::number(iniData.weight));}else if(fileType == "json"){ui->le_name->setText(jsonData.name);if(jsonData.gender == "男"){ui->cb_gender->setCurrentIndex(0);}else{ui->cb_gender->setCurrentIndex(1);}ui->le_age->setText(QString::number(jsonData.age));ui->le_height->setText(QString::number(jsonData.height));ui->le_weight->setText(QString::number(jsonData.weight));}
}void Widget::on_pb_xmlRead_clicked()
{xmlFlieRead();
}void Widget::on_pb_xmlWrite_clicked()
{setFileValue("xml");if(xmlFileWrite()){QMessageBox::information(this,"提示","xml文件保存成功!");}
}void Widget::on_pb_iniRead_clicked()
{iniFileRead();
}void Widget::on_pb_iniWrite_clicked()
{setFileValue("ini");if(iniFileWrite()){QMessageBox::information(this,"提示","ini文件保存成功!");}
}void Widget::on_pb_jsonRead_clicked()
{jsonFileRead();
}void Widget::on_pb_jsonWrite_clicked()
{setFileValue("json");if(jsonFileWrite()){QMessageBox::information(this,"提示","json文件保存成功!");}
}

3.widget.ui

4.示例中各文件的内容

五、下载链接

我的示例百度网盘链接:https://pan.baidu.com/s/1M1Flq0-1lj4A5KV3sRdLUw
提取码:xxcj


总结

可以看到本文demo中所进行读写的几个文件都是比较简单的,内容比较少并且结构也比较简易,这里也只是为大家展示基本的读写方法。但是在实际的开发过程中,文件内容会存在循环,嵌套等等的复杂结构,对于相关的文件大家可以查看文末的参考文章。在我们的开发过程中需要注意观察,其实这几种类型的文件读写都是比较简单的,本质上都是获取参数,进行文件写,读取参数,界面显示读到的参数。另外在实际开发中,建议先进行写文件,再然后读,这样感觉开发起来简单(哈哈这是我自己的感jio~~~)。


hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

参考文章:
QT中读取XML文件三种方式的实例
Qt读写ini文件
JSON简介
Qt 操作Json格式文件(创建、插入、解析、修改、删除)

Qt下实现XML、INI、JSON的文件读写示例开发相关推荐

  1. OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作

    OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作 一.Write_XML_and_YAML_File(写入XML) #include <opencv2/opencv ...

  2. java 如何导出json文件_java导出json格式文件的示例代码

    本文介绍了java导出json格式文件的示例代码,分享给大家,具体如下: import java.io.File; import java.io.FileWriter; import java.io. ...

  3. Qt下使用vs编译的库文件

    Qt下调用VS制作的静态库    1.制作静态库的编译器和Qt版本的编译器是一样     如果是使用Visual Studio 制作的静态库,比如使用Visual Studio 2013制作的,而要使 ...

  4. python json转xml_Python中xml和json格式相互转换操作示例

    本文实例讲述了Python中xml和json格式相互转换操作.分享给大家供大家参考,具体如下: Python中xml和json格式是可以互转的,就像json格式转Python字典对象那样. xml格式 ...

  5. ios本地文件内容读取,.json .plist 文件读写

    本地文件.json .plist文件是较为常用的存储本地数据的文件,对这些文件的操作也是一种常用的基础. 本文同时提供初始化变量的比较标准的写法,如果你有更好的初始化变量的写法,欢迎留言提醒我. .j ...

  6. java流读写_java流概述以及文件读写示例

    1. 先分清楚是字节流还是字符流. 字节流:InputStream OutputStream 字符流:Reader Writer 字符流与字节流的区别是读取的单位长度不同,字节流读8字节,字符流读16 ...

  7. linux 目录 读写,Linux C 文件与目录3 文件读写(示例代码)

    文件读写 文件读写是指从文件中读出信息或将信息写入到文件中.Linux文件读取可使用read函数来实现的,文件写入可使用write函数来实现.在进行文件写入的操作时,只是在文件的缓冲区中操作,可能没有 ...

  8. context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)

    Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下.我们可以在这里找到 server.xml 和 context.xml.当然,还有其他一些资源文件.但是在在本文中我们只用得 ...

  9. oracle中app文件夹下,Oracle Form开发之folder(文件夹)功能开发(一)

    一.模板制作:YSFOLDER.FMB 打开TEMPLATE.FMB,如果打开的是APPSTAND.FMB,以下步骤省略: 1.FORM级触发器: 1.在WHEN-NEW-FORM-INSTANCE后 ...

最新文章

  1. 前端和后端的英文_前端工程师一般都喜欢去哪些网站逛?
  2. 不等于在python中怎么打_python中的不等于号怎么写
  3. Bootstrap表格表单
  4. 如何批量将 webp 格式的图片转换为 jpg 格式
  5. npm安装vant(有赞UI)框架 - cmd篇
  6. shape from shading
  7. 【Python】P2191 小Z的情书
  8. vim从入门到丝滑学习笔记
  9. 什么是BlockingQueue
  10. 将边缘云装进胶囊数据中心需要几步?
  11. 为什么要做网站备案?
  12. Win10下载Ubuntu Linux虚拟机设置管理员名称时无法通过NAME_REGEX的检查,--force-badname也无法通过
  13. 什么叫“全力以赴”?
  14. Android 开发 Tip 3 -- that was originally added here
  15. 深大和南科大计算机,南方科技大学和深圳大学,到底哪一所的性价比高呢
  16. OpenRASP管理后台安装(亲测)
  17. Windows10下Linux子系统Ubuntu使用教程(1)——安装
  18. linux生成文件清单,技术|使用 Linux stat 命令创建灵活的文件列表
  19. 周岭《认知觉醒》读书笔记
  20. 物联网 阿里云 电信云 移动oneNET 腾讯云 华为云 能接入的NBIOT通信协议

热门文章

  1. 开源 串口调试助手 BaoYuanSerial 使用教程
  2. 隔板法详解(各种方法)(转载)
  3. 手机html swf文件,【转载】在HTML中插入swf文件(转)
  4. 图像的平滑滤波、边缘检测、阈值化、腐蚀膨胀等原理介绍
  5. android ui 框架
  6. protocol buffer编码原理,让你理解pb是如何实现的
  7. 微软服务器无法连接,wsus无法连接同步微软更新服务器
  8. 周育如的音标口诀大全_英标发音表记忆口诀 这些顺口溜可以学起来
  9. 【JS】postMessage 用法(可以给iframe传值)
  10. 基于springboot+vue的大学生交友活动管理网站 elementui