在Qt中读取和写入二进制文件

Reading and writing binary files in Qt

本文关键字:二进制文件 读取 Qt      更新时间:2023-10-16

我将在Qt项目中使用二进制文件,作为Qt的新手,我不确定是否应该使用QVector<quint8>QByteArray来存储数据。文件可能非常小(<1MiB)或非常大(>4GiB)。在运行时之前,大小未知。

我需要能够进行随机搜索,并能够处理文件中每个字节的操作。内存映射文件在这里有用吗?

谢谢你的建议。

在内存中加载整个大文件,无论是QVector还是QByteArray,都可能不是一个好的解决方案。

假设文件具有某种结构,您应该使用QFile::seek将自己定位在"记录"的开头,并使用qint64 QIODevice::read ( char * data, qint64 maxSize )在您选择的缓冲区中一次读取一条记录。

QIODevice::writeQByteArray有过载,如果这会影响您的决策。对于更大的数据,CCD_ 9可能值得一看。在一天结束的时候,这真的取决于你,因为各种容器都可以工作。

编辑:

我认为使用您喜欢的任何缓冲区的基本文件I/O可能就是您所需要的全部。使用QFileQDataStreamQByteArray等对象。您可以使用循环缓冲区只读取和处理文件的部分内容,以节省内存,尤其是在处理音频、视频或适合流的内容时。如果文件有一个已知的结构,如XML、CSV等,也可以使部分读取和处理更容易,因为您可以逐行或逐个标记。

内存映射文件使用虚拟内存来实现更快的I/O,基本上是在虚拟内存段中的磁盘上复制文件,然后应用程序就可以像处理内存一样使用该文件。能够将文件视为进程内存,可以进行就地编辑,这比从文件的开头查找位置更快,也比进行依赖于操作系统的API调用和处理硬盘读/写更快。内存映射文件往往会有相当大的开销,并且根据在目标平台中如何实现分页或使用什么体系结构,可能会有一些限制。在Qt中,你必须设计自己的对象来使用内存映射文件,从历史上看,我相信linux系统比windows更好地支持这一功能。