Что могло вызвать ошибку unknown_EOF с функцией readOpen libbzip2? - PullRequest
0 голосов
/ 06 августа 2020

Я следую программированию bzip2 с инструкциями libbzip2, чтобы создать сценарий для сжатия / распаковки, но у меня возникли проблемы с этапом чтения. Вот мой код:

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, и получил тот же результат.

1 Ответ

0 голосов
/ 06 августа 2020

Похоже, вы читаете весь входной файл, прежде чем решите, декодируете вы или нет. Если да, то вы пытаетесь продолжить чтение того же входного файла, даже если вы уже достигли конца файла. Значит, вы ничего не получите.

...