在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::write
对QByteArray
有过载,如果这会影响您的决策。对于更大的数据,CCD_ 9可能值得一看。在一天结束的时候,这真的取决于你,因为各种容器都可以工作。
编辑:
我认为使用您喜欢的任何缓冲区的基本文件I/O可能就是您所需要的全部。使用QFile
、QDataStream
、QByteArray
等对象。您可以使用循环缓冲区只读取和处理文件的部分内容,以节省内存,尤其是在处理音频、视频或适合流的内容时。如果文件有一个已知的结构,如XML、CSV等,也可以使部分读取和处理更容易,因为您可以逐行或逐个标记。
内存映射文件使用虚拟内存来实现更快的I/O,基本上是在虚拟内存段中的磁盘上复制文件,然后应用程序就可以像处理内存一样使用该文件。能够将文件视为进程内存,可以进行就地编辑,这比从文件的开头查找位置更快,也比进行依赖于操作系统的API调用和处理硬盘读/写更快。内存映射文件往往会有相当大的开销,并且根据在目标平台中如何实现分页或使用什么体系结构,可能会有一些限制。在Qt中,你必须设计自己的对象来使用内存映射文件,从历史上看,我相信linux系统比windows更好地支持这一功能。
- 如何在 c++ 中将二进制文件读取为字符串
- 从二进制文件读取到数组:前面的任意数字
- 提升二进制文件读取错误不支持的版本
- 无法将二进制文件读取到 std::vector<std::byte> 中C++
- 提升序列化在从二进制文件读取时引发异常
- 从二进制文件 C++ 读取的字符串数组写入
- 将二进制文件读取到 std::vector<bool>
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 将从二进制文件读取的字符串转换为整数
- 从/到C 的二进制文件读取和写作整数
- 通过将结构信息从二进制文件读取到数组中,然后返回到文件C
- 将 int 的二进制文件读取到字符串 c++
- 将结构从二进制文件读取到链表,导致无限循环
- 将二进制文件读取到向量元素的地址中
- c++从二进制文件读取/写入类
- Python:将二进制文件读取到一个结构中,然后拆包
- 从二进制文件读取/写入十六进制字节
- 简单的 C++ 二进制文件读取
- 从二进制文件 c++ 读取 16 位整数
- 如何优化c++二进制文件读取