【ini,xml,CSV,JSON,...】

1 CSV

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),
在这里插入图片描述
在这里插入图片描述

2 JSON

2.1 QJsonValue

void remove(const QString &key);
QJsonValue take(const QString &key);
bool contains(const QString &key) const;
void remove(QStringView key);
void remove(QLatin1String key);
QJsonValue take(QStringView key);
QJsonValue take(QLatin1String key);
bool contains(QStringView key) const;
bool contains(QLatin1String key) const;

2.2 QJsonArray

删除数组 i;
void removeAt(int i);   //jArray.removeAt(0);  //ok //删除第0项
QJsonValue takeAt(int i);  //qDebug() << jArray.takeAt(0).toInt() << endl;      //删除第0项并返回值

替换:
QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray.insert(3,jArray);  //ok
jArray.replace(3,jArray); //ok
jArray[4]= 12;            //无效   数组越界无效
jArray[0]= 54;            //ok  
(*configJson->RootObjPointer())["IP"]=jArray;      //获取指针方式修改“IP”
configJson->savejsonfile();

2.3 QJsonObject

是否包含Student
QJsonObject obj=doc.object();
if(obj.contains("Student"))
{
}

2.4 [“IP”]

/*【】是用来填充数据使用 */
(*configJson->RootObjPointer())["IP"]=jArray;
/*.value 这种方式是用来获取数据*/
(*configJson->RootObjPointer()).value("IP")=jArray;

2.5 JSON注意事项:

  1. 数组中不能是00 “NightMode”: [18, 00, 0, 6, 0, 0] //解析不出来
  2. 数组中是int类型的数据 不要用QString 去替换,会不成功。
  3. 修改json类型要修改他的指针,重新填充数据要重新赋值给上层的父类,保存才能达到效果,不能获取的只是临时变量。(如下例子)
QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray[4]= 12;            //无效  (数组越界 )
jArray.insert(3,jArray);  //ok   (可以插入任意类型 )
jArray.replace(3,jArray); //ok   (可以替换任意类型 )
jArray[0]= 54;            //ok  (数组不越界 )
(*configJson->RootObjPointer())["IP"]=jArray;  //Ok      (通过指针来获取“IP”,并赋值)
configJson->savejsonfile();

2.6 案例1

在这里插入图片描述

2.7 案例2

在这里插入图片描述

QByteArray byte;
QFile file(file_path);
if(file.exists()){
        file.open(QIODevice::ReadOnly|QIODevice::Text);
        byte=file.readAll();
        file.close();
}    
else
{
    cout<<"openFileError"<<endl;;
}
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsondocument::fromJson(byte,&json_error));
if(json_error.err!=QJsonParseError::NoError)
    {
        cout<<" json error "<<endl;
    }
QJsonObject rootobj=jsonDoc.object();
//一般需要使用 rootobj.contains(xxx) 判断一下是否存在 这里我们就默认是存在的 。
 
QJsonObject A_obj=rootobj.value("A").toObject();
A_obj["AA"]=33;
 
QJsonArray B_array=rootobj.value("B").toArray();
QJsonObject B_Subobj=B_array[0].toObject();
QJsonArray b_array=B_Subobj.value("BB").toArray();
b_array.replace(0,"BBB");
B_Subobj["BB"]=b_array;
B_array.replace(0,B_Subobj);
 
QJsonObject C_obj=rootobj.value("C").toObject();
QJsonArray c_array=C_obj.value("CC").toArray();
c_array.replace(0,"CCC");
C_obj["CC"]=c_array;
 
rootobj["A"]=A_obj;
rootobj["B"]=B_array;
rootobj["C"]=C_obj;
 
QFile file(file_path);
if(file.exists()){
        file.open(QIODevice::WriteOnly|QIODevice::Text);
        jsonDoc.setObject(rootobj);
        file.seek(0);
        file.write(jsonDoc.toJson());
        file.flush();
        file.close();
}

3 ini

qreadini.h

#ifndef QREADINI_H
#define QREADINI_H
#include<QSettings>
#define DATACONFIG  QReadIni::getInstance()->getIniConfig()

typedef struct IniConfig
{
    QString ip;                //IP地址
    QString port;              //端口
    QString dataBaseVersion;   //数据库版本
    QString dataBaseName;      //数据库名称
    QString userName;          //用户名
    QString passWord;          //密码
}IniConfig;

class QReadIni
{
public:
    static QReadIni*getInstance();
    void readIni();
    const IniConfig &getIniConfig();
private:
    QReadIni();
    IniConfig iniConfig;
    static QReadIni*instance;
};
#endif // QREADINI_H

qreadini.cpp

#include "qreadini.h"

QReadIni*QReadIni::instance = NULL;
QReadIni *QReadIni::getInstance()
{
    if(instance == NULL)
    {
        instance = new QReadIni();
    }
    return instance;
}

QReadIni::QReadIni()
{
    this->readIni();
}
void QReadIni::readIni()
{
    QSettings * configIniRead = new QSettings("config.ini",QSettings::IniFormat);//初始化读取Ini文件对象
    iniConfig.ip = configIniRead->value("conn/ip").toString();                          //IP地址
    iniConfig.port = configIniRead->value("conn/port").toString();                      //端口
    iniConfig.dataBaseVersion = configIniRead->value("conn/databaseversion").toString();//数据库版本
    iniConfig.dataBaseName = configIniRead->value("conn/databasename").toString();      //数据库名称
    iniConfig.userName = configIniRead->value("conn/username").toString();              //用户名
    iniConfig.passWord = configIniRead->value("conn/password").toString();              //密码
    delete configIniRead;
}

const IniConfig &QReadIni::getIniConfig()
{
    return iniConfig;
}

写ini文件

#include <QtCore/QCoreApplication>  
#include <QSettings>  
int main(int argc, char *argv[])  
{  
   QCoreApplication a(argc, argv);  
   //Qt中使用QSettings类读写ini文件  
   //QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省  
   QSettings *configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat);  
   //向ini文件中写入内容,setValue函数的两个参数是键值对  
   //向ini文件的第一个节写入内容,ip节下的第一个参数  
   configIniWrite->setValue("/ip/first", "192.168.0.1");  
   //向ini文件的第一个节写入内容,ip节下的第二个参数  
   configIniWrite->setValue("ip/second", "127.0.0.1");  
   //向ini文件的第二个节写入内容,port节下的第一个参数  
   configIniWrite->setValue("port/open", "2222");  
   //写入完成后删除指针  
   delete configIniWrite;  
     
   return a.exec();  
}

在这里插入图片描述

4 xml

  1. 新建类 ReadWriteXml
    readwritexml.h
#ifndef READWRITEXML_H
#define READWRITEXML_H

#include<QtXml>
#include<QFile>

class ReadWriteXml
{
public:
    ReadWriteXml();

    bool writeToXml(const QString &xmlPath);
    bool readFromXml(const QString &xmlPath);
protected:
    virtual void readFromDocument(const QDomElement &rootElement)=0;
    virtual void writeToDocument(QDomDocument &doc)=0;
private:
    QDomDocument m_doc;
    QFile m_file;  //打开一个xml文件

};

#endif // READWRITEXML_H

readwritexml.cpp

#include "readwritexml.h"

ReadWriteXml::ReadWriteXml()
{

}

bool ReadWriteXml::writeToXml(const QString &xmlPath)
{
    m_doc.clear();
    QDomProcessingInstruction ins;
    ins=m_doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'UTF-8\'");
    m_doc.appendChild(ins);

    writeToDocument(m_doc);   //写数据到m_doc
    m_file.setFileName(xmlPath);
    bool isOk=m_file.open(QIODevice::WriteOnly);
    if(isOk==false)
    {
        return false;
    }

    QTextStream stream(&m_file);//m_doc 保存到硬盘
    m_doc.save(stream,4);
    m_file.close();

    return true;
}

bool ReadWriteXml::readFromXml(const QString &xmlPath)
{
    m_file.setFileName(xmlPath);
    bool isOk=m_file.open(QIODevice::ReadOnly);
    if(isOk==false)
    {
        return false;
    }
    m_doc.setContent(&m_file);
    //获得xml根节点
    QDomElement rootElement=m_doc.documentElement();
    //以上部分读xml文件固定套路
    //下边是具体从根节点读出xml中信息,实际怎么读要根据具体工程,所以写成纯虚函数,具体应用时实现
    readFromDocument(rootElement);

    m_file.close();
    return true;
}

  1. 新建XmlReadTest类继承ReadWriteXml

readwritexml.h

#ifndef XMLREADTEST_H
#define XMLREADTEST_H

#include"readwritexml.h"

class XmlReadTest : public ReadWriteXml
{
public:
    XmlReadTest();

protected:
    virtual void readFromDocument(const QDomElement &rootElement);
    virtual void writeToDocument(QDomDocument &doc);
private:

};

#endif // XMLREADTEST_H

readwritexml.cpp

#include "xmlreadtest.h"
#include<QDebug>

XmlReadTest::XmlReadTest()
{

}

void XmlReadTest::readFromDocument(const QDomElement &rootElement)
{
    static int i=1;  //打印节点顺序号
    int num=0;//计算距离根节点的辈数
    QDomNode parentNode=rootElement.parentNode();
    while (parentNode.isNull()==false)
    {
        num++;
        parentNode=parentNode.parentNode();
    }
    QString str=rootElement.attribute("name");
    //根据辈数输出定位,以便打印时有层次感
    qDebug()<<QString("%1:%2").arg(i++).arg(str,num*4);  //读出本节点信息,处理信息
    QDomElement child=rootElement.firstChildElement("Label");//试图获取长子节点
    while(child.isNull()==false)
    {
        readFromDocument(child);  //节点存在,递归调用,继续获取后代信息
        child=child.nextSiblingElement("Label");//试图获取兄弟节点
    }
}

void XmlReadTest::writeToDocument(QDomDocument &doc)
{
    Q_UNUSED(doc)
}
  1. mainwindow
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"xmlreadtest.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    XmlReadTest readTest;
    //xml路径修改为自己xml路径
    readTest.readFromXml("D:/Project_Qt_01/build-readxml-Desktop_Qt_5_12_9_MinGW_64_bit-Debug/debug/config.xml");
}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述

5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光芒Shine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值