我目前需要一些帮助来学习如何使用bzlib.h头文件。我想知道是否有人能帮助我在C ++ 中使用任何Boost库找出一个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
任何帮助?
答案 0 :(得分: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))
我建议您阅读有关使用流的更多信息。
答案 1 :(得分:1)
答案 2 :(得分: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);