Qt | 您所在的位置:网站首页 › 二进制方式读取文件 › Qt |
目录Qt中的读写QDataStreamQDataStreamQt 是如何存储数据的如何保证读取数据的正确性? --> 魔术数字,文件版本,Qt版本魔术数字文件版本Qt 版本读取添加了魔数和版本号的文件什么是流的形式完整的Demo
Qt中的读写
Qt中,除了QIODevice提供了read()、readLine()、readAll()以及write()等基本的操作。同时,Qt 还提供了更高一级的操作:用于二进制的流QDataStream和用于文本流的QTextStream。本节,我们将讲解有关QDataStream的使用以及一些技巧。下一篇介绍QTextStream的相关内容 QDataStreamQDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。 QDataStreamQDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。 结合QIODevice,QDataStream可以很方便地对文件、网络套接字等进行读写操作。我们从代码开始看起: QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); out a;需要注意的是: 你必须按照写入的顺序,将数据读取出来。也就是说,程序数据写入的顺序必须预先定义好。在这个例子中,我们首先写入字符串,然后写入数字,那么就首先读出来的就是字符串,然后才是数字。顺序颠倒的话,程序行为是不确定的,严重时会直接造成程序崩溃。 如何保证读取数据的正确性? --> 魔术数字,文件版本,Qt版本由于二进制流是纯粹的字节数据,带来的问题是,如果程序不同版本之间按照不同的方式读取(前面说过,Qt 保证读写内容的一致,但是并不能保证不同 Qt 版本之间的一致),数据就会出现错误。因此,我们必须提供一种机制来确保不同版本之间的一致性。通常,我们会使用如下的代码写入: QFile file("file.dat"); file.open(QIODevice::WriteOnly); QDataStream out(&file); // 写入魔术数字和版本 out version; if (version < 100) { return BAD_FILE_TOO_OLD; } if (version > 123) { return BAD_FILE_TOO_NEW; } if (version > lots_of_interesting_data; if (version >= 120) { in >> data_new_in_version_1_2; } in >> other_interesting_data;这段代码就是按照前面的解释进行的。 首先读取魔术数字,检查文件是否合法。如果合法,读取文件版本:小于 100 或者大于 123 都是不支持的。如果在支持的版本范围内(100 |
CopyRight 2018-2019 实验室设备网 版权所有 |