Сжатие BZ2 в C ++ с помощью bzlib.h - PullRequest
4 голосов
/ 29 февраля 2012

Мне нужна помощь в изучении использования заголовка bzlib.h. Мне было интересно, если кто-нибудь будет так любезен, чтобы помочь мне выяснить функцию compressToBZ2 () в C ++ без , используя какие-либо библиотеки Boost?

void compressBZ2(std::string file)
{
std::ifstream infile;
int fileDestination = infile.open(file.c_str());

char bz2Filename[] = "file.bz2";
FILE *bz2File = fopen(bz2Filename, "wb");
int bzError;
const int BLOCK_MULTIPLIER = 7;
BZFILE *myBZ = BZ2_bzWriteOpen(&bzError, bz2File, BLOCK_MULTIPLIER, 0, 0);

const int BUF_SIZE = 10000;
char* buf = new char[BUF_SIZE];
ssize_t bytesRead;

while ((bytesRead = read(fileDestination, buf, BUF_SIZE)) > 0)
{
    BZ2_bzWrite(&bzError, myBZ, buf, bytesRead);
}

BZ2_bzWriteClose(&bzError, myBZ, 0, NULL, NULL);

delete[] buf;
}

Я пытался использовать что-то подобное, но мне не повезло. Я пытаюсь получить файл .bz2 , а не .tar.bz2

Любая помощь?

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

Эти две строки неверны:

int fileDestination = infile.open(file.c_str());

// ...

while ((bytesRead = read(fileDestination, buf, BUF_SIZE)) > 0)

Это не так, как std::ifstream работает.Например, если вы посмотрите на std::ifstream::open, то ничего не вернется.Кажется, вы смешиваете старые системные вызовы open / read с концепцией потока C ++.

Просто сделайте:

infile.open(file.c_str());

// ...

while (infile.read(buf, BUF_SIZE))

Я рекомендую вам прочитать больше об использовании потоков.

1 голос
/ 27 февраля 2013

Я изменил цикл, и он работает.

int BUF_SIZE = 1024 * 10;    
char* buf = new char[BUF_SIZE];
while(infile.tellg() >= 0) {
    infile.read(buf, BUF_SIZE);
    BZ2_bzWrite(&bzError, myBZ, buf, infile.gcount());
}    
BZ2_bzWriteClose(&bzError, myBZ, 0, NULL, NULL);
1 голос
/ 29 февраля 2012

Попробуйте с libbzip2.

Это доступно в C.

http://bzip.org/

Пример кода см .: dlltest.c

...