自学内容网 自学内容网

「QT」文件类 之 QDataStream 数据流类

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「QT」QT5程序设计
📚全部专栏
「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制开发
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明

QDataStream类在Qt 5.15中的详细介绍

一、引言

QDataStream是Qt框架中的一个类,它提供了基于Qt数据类型的二进制流接口。通过QDataStream,可以方便地将Qt的基本数据类型(如整型、浮点型、字符串等)以及自定义的Qt对象序列化(即将对象的状态转换为字节流)和反序列化(即从字节流恢复对象的状态)。QDataStream支持的平台无关性使得它成为跨平台数据交换和存储的理想选择。

二、使用范围

QDataStream广泛应用于以下场景:

  • 文件存储:将对象的状态保存到文件中,以便稍后恢复或在不同程序之间共享。
  • 网络通信:通过网络发送和接收Qt对象,实现客户端和服务器之间的数据交换。
  • 内存中的数据交换:在程序的不同部分之间传递Qt对象,而无需依赖于特定的对象序列化机制。

三、类的头文件

QDataStream类的头文件是<QDataStream>。在使用QDataStream时,需要包含这个头文件。

#include <QDataStream>

四、类的注意事项

  1. 字节序:QDataStream默认使用小端字节序(即最低有效字节存储在最低内存地址)。如果需要与使用大端字节序的系统进行交互,可以使用setByteOrder()函数进行调整。
  2. 浮点数精度:在序列化浮点数时,QDataStream会保留足够的精度以恢复原始值,但请注意,由于浮点数的表示方式,非常小的差异可能是不可避免的。
  3. 版本兼容性:当使用QDataStream进行持久化存储时,应考虑数据格式的版本兼容性。如果数据格式发生变化,可能需要提供向后兼容的读取逻辑。
  4. 自定义类型支持:对于自定义的Qt对象,需要实现<<>>运算符的重载,以便QDataStream能够正确地序列化和反序列化它们。

五、类的继承

QDataStream是一个独立的类,不继承自其他Qt类。它提供了用于读写二进制数据的接口,并与Qt的数据类型系统紧密结合。

六、类的构造介绍

QDataStream有两个主要的构造函数,分别用于基于设备(如文件、缓冲区等)和基于字节数组的流。

  • QDataStream(QIODevice *device):创建一个与指定设备关联的QDataStream对象。设备可以是文件、内存缓冲区、网络连接等。
  • QDataStream(QByteArray *array, QIODevice::OpenMode mode = QIODevice::ReadWrite):创建一个与指定字节数组关联的QDataStream对象。这种模式通常用于在内存中处理数据。

七、公有函数介绍

QDataStream提供了一系列公有函数来读写数据。以下是一些常用的公有函数:

  • *QIODevice device() const:返回与流关联的设备对象(如果有的话)。
  • void setDevice(QIODevice *device):设置与流关联的新设备对象。
  • void setByteOrder(QDataStream::ByteOrder byteOrder):设置流的字节序。
  • QDataStream::ByteOrder byteOrder() const:返回流的当前字节序。
  • void setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision):设置浮点数的精度。
  • QDataStream::FloatingPointPrecision floatingPointPrecision() const:返回浮点数的当前精度。

此外,QDataStream还重载了<<>>运算符,用于读写基本数据类型和自定义类型。

八、Static函数介绍

QDataStream没有提供静态函数。它的所有功能都通过对象实例的方法来实现。

九、运算符重载

QDataStream重载了<<(插入运算符)和>>(提取运算符),以便能够方便地将数据写入流和从流中读取数据。这些运算符对于基本数据类型(如intfloatQString等)以及支持QDataStream的自定义类型都是可用的。

对于自定义类型,需要实现这些运算符的重载,以便QDataStream能够正确地处理它们。例如:

QDataStream &operator<<(QDataStream &out, const MyCustomType &obj) {
    // 将MyCustomType的状态写入out
    out << obj.field1 << obj.field2 << ...;
    return out;
}

QDataStream &operator>>(QDataStream &in, MyCustomType &obj) {
    // 从in中读取MyCustomType的状态
    in >> obj.field1 >> obj.field2 >> ...;
    return in;
}

十、详细代码举例

以下是一个使用QDataStream的示例代码,用于演示如何将一个自定义的Qt对象序列化到文件,并从文件中反序列化回来。

#include <QCoreApplication>
#include <QDataStream>
#include <QFile>
#include <QIODevice>
#include <QString>
#include <QDebug>

// 自定义类型
class MyData {
public:
    int id;
    QString name;
    float value;

    // 实现QDataStream的<<运算符重载
    friend QDataStream &operator<<(QDataStream &out, const MyData &data) {
        out << data.id << data.name << data.value;
        return out;
    }

    // 实现QDataStream的>>运算符重载
    friend QDataStream &operator>>(QDataStream &in, MyData &data) {
        in >> data.id >> data.name >> data.value;
        return in;
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 创建并填充一个MyData对象
    MyData data;
    data.id = 123;
    data.name = "Example";
    data.value = 45.67f;

    // 将对象序列化到文件
    QFile file("data.dat");
    if (file.open(QIODevice::WriteOnly)) {
        QDataStream out(&file);
        out << data;
        file.close();
    } else {
        qWarning() << "Failed to open file for writing";
    }

    // 从文件中反序列化对象
    MyData newData;
    if (file.open(QIODevice::ReadOnly)) {
        QDataStream in(&file);
        in >> newData;
        file.close();

        // 打印反序列化后的对象状态
        qDebug() << "ID:" << newData.id;
        qDebug() << "Name:" << newData.name;
        qDebug() << "Value:" << newData.value;
    } else {
        qWarning() << "Failed to open file for reading";
    }

    return app.exec();
}

在这个示例中,我们首先定义了一个自定义类型MyData,并实现了QDataStream的<<>>运算符重载,以便能够序列化和反序列化该类型。然后,我们创建了一个MyData对象,并将其序列化到一个名为data.dat的文件中。接着,我们从该文件中读取数据,并将其反序列化回一个MyData对象。最后,我们打印了反序列化后的对象状态以验证结果。


在这里插入图片描述


原文地址:https://blog.csdn.net/qq_49443542/article/details/143777597

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!