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

私がやろうとしているのは、このようなものを使うことですが、運がありませんでした。.tar.bz2ではなく.bz2ファイルを取得しようとしています

何か助けはありますか?

4

3 に答える 3

4

これらの2行は間違っています:

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

// ...

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

これはどのようにstd::ifstream機能するかではありません。たとえば、それを見るとstd::ifstream::open何も返されません。古いシステムコールとC++ストリームの概念を混同しているようopenですread

ただ行う:

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 に答える