Чтение и запись бинарных файлов в Qt - PullRequest
4 голосов
/ 15 марта 2012

Я собираюсь работать с двоичными файлами в проекте Qt, и, будучи немного новичком в Qt, я не уверен, следует ли мне использовать QVector<quint8> или QByteArray для хранения данных. Файлы могут быть очень маленькими (<1MiB) или очень большими (> 4GiB). Размер неизвестен до времени выполнения.

Мне нужно иметь возможность произвольного поиска и уметь обрабатывать операции с каждым байтом в файле. Будет ли здесь отображаться файл с памятью?

Спасибо за любые предложения.

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Загрузка целых больших файлов в память, будь то QVector или QByteArray, вероятно, не является хорошим решением.

Предполагая, что файлы имеют какую-то структуру, вы должны использовать QFile::seek, чтобы позиционировать себя в начале "записи", и qint64 QIODevice::read ( char * data, qint64 maxSize ), чтобы читать по одной записи за раз в буфере по вашему выбору.

3 голосов
/ 15 марта 2012

QIODevice::write имеет перегрузку для QByteArray, если это влияет на ваше решение. QDataStream может стоить посмотреть на большие данные. В конце концов, все зависит от вас, так как различные контейнеры будут работать.

Edit:

Я думаю, что базовый файловый ввод / вывод с использованием любого буфера, который вы предпочитаете, это, вероятно, все, что вам нужно. Используйте такие объекты, как QFile, QDataStream, QByteArray и т. Д. Вы можете читать и обрабатывать только части файла с кольцевыми буферами для экономии памяти, особенно если речь идет о аудио, видео или чем-то, что поддается потокам. Если в файле есть известная структура, такая как XML, CSV и т. Д., Которая также упрощает частичное чтение и обработку, поскольку вы можете переходить строка за строкой или тег за тегом.

Файлы, отображенные в память, используют виртуальную память для достижения более быстрого ввода-вывода путем создания копии файла на диске в сегменте виртуальной памяти, который затем может использоваться приложением, как если бы он был просто памятью процесса. Возможность обрабатывать файл как память процесса позволяет вам выполнять редактирование на месте, что быстрее, чем поиск позиции с начала файла, и быстрее, чем выполнение зависимых от ОС вызовов API и работа с операциями чтения / записи на жестком диске. Как правило, на файлы, отображаемые в память, накладываются значительные накладные расходы, и существуют некоторые возможные ограничения в зависимости от того, как подкачка реализована на вашей целевой платформе или какая архитектура вы используете. В Qt вам придется проектировать свои собственные объекты для использования файлов с отображенной памятью, и исторически я считаю, что системы Linux поддерживают эту функциональность лучше, чем windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...