2012-02-29 3 views
3

현재 bzlib.h 헤더를 사용하는 방법을 배우는 데 도움이 필요합니다. 아무도 그렇게 친절한 내가 어떤 부스트 라이브러리를 사용없이 C에서 compressToBZ2() 함수를 알아낼 수 있도록 친절하게 될지 궁금 해서요?bzlib.h를 사용하여 C++에서 BZ2 압축

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

이 두 라인은 잘못 :

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)) 

난 당신이 더 스트림을 사용하는 방법에 대한 읽을 것을 권장합니다.

+0

대단히 감사합니다. 이것은 완벽하게 작동했습니다. 나는 내가 그 (것)들에 너무 익숙하지 않기 때문에 나는 시내에 무언가를 잘못한 것이라고 생각했다. – allejo

1

libbzip2를 사용해보세요.

이 코드 샘플을 참조하십시오 http://bzip.org/

C.

에서 사용할 수 : dlltest.c

1

루프가 수정되어 작동합니다.

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

이 솔루션은이 맥락에서 작동합니다. BZ2_bzwrite에 infile.gcount()를 전달해야합니다. 현재 받아 들여진 해결책으로, 하나는 비어있는 bz2 파일로 끝납니다. –