在Qt中读写二进制文件

4
我将在Qt项目中使用二进制文件,由于对Qt不太熟悉,不确定是否应该使用QVector<quint8>QByteArray来存储数据。文件可能非常小(< 1MiB)或非常大(> 4GiB)。在运行时无法确定大小。
我需要能够随机查找并能够处理文件中的每个字节操作。在这里,内存映射文件是否有用?
感谢任何建议。
2个回答

4

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

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


3

QIODevice::write有一个针对QByteArray的重载,如果这影响了你的决定。对于更大的数据,可以考虑使用QDataStream。最终,各种容器都可以胜任。

编辑:

我认为使用任何你喜欢的缓冲区进行基本的文件I/O可能就足够了。使用像QFileQDataStreamQByteArray等对象。使用循环缓冲区可以在处理音频、视频或其他流媒体时节省内存,只读取和处理文件的一部分。如果文件具有已知的结构,如XML、CSV等,则也可以按行或标记逐个读取和处理,从而更加轻松。

内存映射文件通过使用虚拟内存实现更快速的I/O,基本上是在虚拟内存段中复制磁盘上的文件副本,然后可以像处理进程内存一样由应用程序使用。将文件视为进程内存使您能够进行原地编辑,这比必须从文件开头寻找位置和处理磁盘读/写的OS依赖性API调用要快得多。使用内存映射文件通常会带来相当多的开销,并且根据目标平台中分页的实现方式或您使用的架构,可能存在一些潜在的限制。在Qt中,您需要设计自己的对象来使用内存映射文件,并且历史上,我认为Linux系统比Windows更支持此功能。


如果我将整个文件读入 QVector 或 QByteArray中,这样会不会也占用大量内存? - nerozehl
据我所知,Qt没有内存映射文件的构造函数,因此我认为您将要自己编写。就像所有事情一样,需要考虑权衡利弊。请参见答案中的其他评论。 - AJG85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接