0

libbzip2 命令を使用して bzip2 プログラミングに従って圧縮/解凍用のスクリプトを作成していますが、読み取りステップで問題が発生しました。これが私のコードです:

int decode = (argv[4][0]=='d');
 FILE* f = fopen( argv[2], "rb" ); if( f==0 ) return 2;
 FILE* g = fopen( argv[3], "wb" ); if( g==0 ) return 2;
 int bzError;
 int nBuf;
 int f_len = flen(f);
 byte* inp = new byte[f_len*4+1024*1024];   if( inp==0 ) return 3;

 
 f_len = fread( inp, 1,f_len, f );
 
 if( decode==0 ) {
   int BLOCK_MULTIPLIER = atoi( argv[5] );
   BZFILE *myBZ = BZ2_bzWriteOpen(&bzError, g, BLOCK_MULTIPLIER, 0, 0);
   BZ2_bzWrite(&bzError, myBZ, inp, f_len);
   BZ2_bzWriteClose(&bzError, myBZ, 0, NULL, NULL);
   
  } else {
   byte buf[4096];
   
   BZFILE *myBZ = BZ2_bzReadOpen(&bzError, f, 0, 0, NULL, 0);
   if (bzError != BZ_OK) {
      fprintf(stderr, "E: BZ2_bzReadOpen: %d\n", bzError);
      return -1;
   }

   while (bzError == BZ_OK) {
      int nread = BZ2_bzRead(&bzError, myBZ, buf, sizeof buf);
      cout<<"nread= "<<nread<<"\n";
      if (bzError == BZ_OK || bzError == BZ_STREAM_END) {
         size_t nwritten = fwrite(buf, 1, nread, stdout);
         if (nwritten != (size_t) nread) {
            fprintf(stderr, "E: short write\n");
            return -1;
  }
}

}

   if (bzError != BZ_STREAM_END) {
      fprintf(stderr, "E: bzip error after read: %d\n", bzError);
      return -1;

}

   BZ2_bzReadClose(&bzError, myBZ);
   return 0;

}

圧縮モードは正常に動作しますが、解凍モードの場合、bzRead ステップは失敗し、エラー メッセージ/ステートメントから次の出力が得られます。

nread = 0 E: 読み取り後の bzip エラー: -7

nread が 0 になるのはなぜですか? また、-7 は予期しない EOF を表しますが、どうしてそれが可能なのでしょうか? 組み込みのLinux bzip2で圧縮されたファイルでもこれを実行しようとしましたが、同じ出力が得られました。

4

1 に答える 1