使用 bzlib.h 在 C++ 中进行 BZ2 压缩

问题描述 投票:0回答:3

我目前需要一些帮助来学习如何使用 bzlib.h 标头。我想知道是否有人愿意帮助我找出 C++ 中的 compressToBZ2() 函数,而不需要使用任何 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 文件 
not

.tar.bz2 有什么帮助吗?

c++ bzip2
3个回答
4
投票

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

我建议您阅读更多有关使用流的内容。


2
投票

它在 C 语言中可用。

https://www.sourceware.org/bzip2

有关代码示例,请参阅:

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

© www.soinside.com 2019 - 2024. All rights reserved.