当前位置 博文首页 > 木木木 的博客:Qt开发之路21---二进制文件读写 QDataStream

    木木木 的博客:Qt开发之路21---二进制文件读写 QDataStream

    作者:[db:作者] 时间:2021-08-20 21:39

    一:概述

    QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。
    QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。
    结合QIODevice,QDataStream可以很方便地对文件、网络套接字等进行读写操作。

    二:写

    #include <QApplication>
    #include <QDebug>
    #include <QFile>
    #include <QDataStream>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QFile file("test.dat");
        if(!file.open(QIODevice::WriteOnly)){
            qDebug()<<"open file failed";
            return -1;
        }
    
        QDataStream out(&file);
        out << QString("the number is ");
        out << qint32(123);
    
        file.close();
    
        return a.exec();
    }
    
    • 首先打开一个名为 test.dat 的文件。然后,将刚刚创建的file对象的指针传递给一个QDataStream实例out。类似于std::cout标准输出流,QDataStream也重载了输出重定向<<运算符。后面的代码就很简单了:将“the number is ”和数字 123 输出到数据流。由于我们的 out 对象建立在file之上,因此相当于将问题和答案写入file。
    • 最好使用 Qt 整型来进行读写,比如程序中的qint32。这保证了在任意平台和任意编译器都能够有相同的行为。
    • 为性能起见,数据只有在文件关闭时才会真正写入。因此,我们必须在最后添加。

    三:读

    将存储到文件中的内容取出来

    #include <QApplication>
    #include <QDebug>
    #include <QFile>
    #include <QDataStream>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QFile file("test.dat");
        if(!file.open(QIODevice::ReadOnly)){
            qDebug()<<"open file failed";
            return -1;
        }
    
        QDataStream in(&file);
        QString str;
        qint32 num;
        in >> str;
        in >> num;
        qDebug()<<str<<num;
    
        file.close();
    
        return a.exec();
    }
    
    
    "the number is " 123
    
    • 注意,必须按照写入的顺序,将数据读取出来。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。
      那么,既然QIODevice提供了read()、readLine()之类的函数,为什么还要有QDataStream呢?QDataStream同QIODevice有什么区别?区别在于,QDataStream提供流的形式,性能上一般比直接调用原始 API 更好一些。

    上一篇:Qt开发之路20—文件操作(QFile、QFileInfo)
    下一篇:Qt开发之路22—文本文件读写 QTextStream

    cs