簡體   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