Получить файлы (кроме текста) из .zip с помощью libzip

Я изучаю C++ и решил обучить меня, создав небольшую программу, которая извлекает файлы из zip, такие как текстовые файлы, изображения или даже другие zip-файлы (но я не хочу извлекать их напрямую, по одному за раз) с помощью библиотека либзип. Итак, я сделал свою программу, но теперь у меня есть проблема. Он хорошо извлекает текстовые файлы, но не такие файлы, как изображения или zip. Он обнаруживает их, дает мне точные имена и размеры, но после извлечения они составляют всего несколько байтов. (но они расположены там, где должны).

Вот мой код: http://pastie.org/6221955

Так что, если бы кто-то мог помочь мне извлечь файлы, которые не являются текстами из zip, было бы здорово! Благодарю вас!


person Tiwenty    schedule 19.02.2013    source источник


Ответы (2)


Вы читаете и записываете двоичные данные в виде текстовой строки. Проблема в том, что строки используют наличие символа NULL (0-байт) для обозначения конца строки. Двоичные данные могут содержать (и определенно содержат) нули повсюду, а не только в конце.

Вам нужно использовать .write (buffer, <size in bytes>) ofstream для записи на диск; вручную указав размер в байтах, вы заставите его прочитать это количество байтов вместо того, чтобы останавливаться на первом экземпляре символа NULL.

person Mahmoud Al-Qudsi    schedule 19.02.2013
comment
Не забудьте также открыть с помощью ios::base::binary, иначе новые строки (которые на самом деле не являются новыми строками в двоичных данных) могут быть преобразованы. - person Cameron; 19.02.2013

Проблема связана с оператором ‹‹. Вы выводите массив символов/строку. Строки в C заканчиваются нулем. Таким образом, первый двоичный 0 завершит ваш вывод.

person Udo Klein    schedule 19.02.2013