5

我目前需要一些帮助来学习如何使用 bzlib.h 标头。我想知道是否有人会在不使用任何 Boost 库的情况下帮助我找出 C++ 中的 compressToBZ2() 函数?

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

有什么帮助吗?

4

3 回答 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))

我建议您阅读有关使用流的更多信息。

于 2012-02-29T06:35:18.870 回答
2

尝试使用 libbzip2。

它在 C 中可用。

https://www.sourceware.org/bzip2

有关代码示例,请参见:dlltest.c

于 2012-02-29T06:33:30.417 回答
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);
于 2013-02-26T20:47:07.857 回答