Вземете файлове (различни от текст) от .zip с libzip

Уча C++ и реших да ме обучава, като направя малка програма, която извлича файлове от zip, като текстови файлове, изображения или дори други zip файлове (но не искам да ги извличам директно, едно нещо на път) с библиотека libzip. Така че направих моята програма, но сега имам проблем. Той извлича добре текстови файлове, но не и файлове като изображения или 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