繁体   English   中英

在Qt中读写二进制文件

[英]Reading and writing binary files in Qt

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

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

谢谢你的任何建议。

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

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

QIODevice::writeQByteArray有重载,如果这会影响您的决定。 QDataStream可能值得查看更大的数据。 在一天结束时,由于各种容器都可以工作,所以由您自己决定。

编辑:

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

内存映射文件使用虚拟内存来实现更快的I / O,基本上是在虚拟内存段中的磁盘上创建一个文件的副本,然后该应用程序可以将其用作应用程序,就好像它只是进程内存一样。 能够将文件视为进程内存允许您进行就地编辑,这比从文件开头寻找位置更快,而且比使用OS依赖的API调用和处理硬盘读/写更快。 内存映射文件确实存在相当大的开销,并且存在一些可能的限制,具体取决于在目标平台中实现分页的方式或您正在使用的体系结构。 在Qt中你必须设计自己的对象来使用内存映射文件,而且从历史上看,我相信linux系统比windows更好地支持这个功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM