QT 自定义结构体的内容存储在dat文件中

使用的是QDataStream进行文件数据流的存储

QT自带的QDataStream只能传递它自己要求的数据类型。但是我们可以自己重载QDataStream& operator<<()和QDataStream& operator>>();这样我们就可以传递struct的类型了

串行化(Serialization)是计算机科学中的一个概念,它是指将对象存储到介质(如文件、内存缓冲区等)中或是以二进制方式通过网络传输。之后可以通过反串行化从这些连续的字节(byte)数据重新构建一个与原始对象状态相同的对象,因此在特定情况下也可以说是得到一个副本,但并不是所有情况都这样。
Qt 对这类组合数据的打包方法就叫串行化(Serializing),在 Qt 帮助文档的索引里输入关键词 Serializing 就可以看到关于 Qt 串行化的帮助主题(Serializing Qt Data Types),除了 C++ 基本数值类型,Qt 还对大量自身的类对象做了串行化。串行化得到一个字节数组 QByteArray ,可以直接用于发送。Qt 串行化数据接收就是发送的逆过程,都是通过 QDataStream 流实现。

1、首先新建一个类,存储三个不同类型的字段信息;

class T
{
public:
    int a;
    double b;
    QString c;
    T(int a1, double b1, QString c1);
    friend QDataStream& operator<<(QDataStream &out, const T &t);
    friend QDataStream& operator>>(QDataStream &in, T &t);
};
T::T(int a1, double b1, QString c1)
{
    a = a1;
    b = b1;
    c = c1;
}

2、分别重写文件读写操作


QDataStream& operator <<(QDataStream &out, const T &t)
{
    out << t.a << t.b << t.c;
    return out;
}
QDataStream& operator >>(QDataStream &in, T &t)
{
    int a;
    double b;
    QString c;
    in >> a >> b >> c;
    t.a = a;
    t.b = b;
    t.c = c;
    return in;
}

3、分别在main函数进行相对应的文件操作即可

    //文件写入
    T t(1, 2, "3");
    QFile writeFile("test.dat");
    writeFile.open(QIODevice::WriteOnly);
    QDataStream out(&writeFile);
    out << t;
    writeFile.close();
    //文件读取
    QFile readFile("test.dat");
    readFile.open(QIODevice::ReadOnly);
    QDataStream in(&readFile);
    in >> t;
    readFile.close();
    qDebug() << t.a << t.b << t.c;

注意最开始的引用:

#include 
#include 
#include 
#include 
#include 

字符串写入 串行化的示例

#include 

//qtcodec.cpp
#include 
#include 
#include 
#include 

using namespace std;
QByteArray TestSerialOut()
{
    //数据
    int nVersion = 1;
    double dblValue = 125.78999;
    QString strName = QObject::tr("This an example.");
    //字节数组保存结果
    QByteArray baResult;
    //串行化的流
    QDataStream dsOut(&baResult, QIODevice::ReadWrite);  //做输出,构造函数用指针
    //设置Qt串行化版本
    dsOut.setVersion(QDataStream::Qt_5_0);//使用Qt 5.0 版本流
    //串行化输出
    dsOut<>nVersion>>dblValue>>strName;

    //打印
    qDebug()<

你可能感兴趣的:(QT)