2015-08-04 2 views
1

Я пробую очень простую вещь: прочитайте минимальный текстовый файл и скомпилируйте его с помощью утилиты compress() от zlib. Я думаю, что все сделано хорошо, я выделяю файлы размером 10 для вывода, это должно быть достаточно, но я продолжаю получать -5 (Z_BUF_ERROR) в результате операции. Любая помощь?C: Zlib compress не работает

#include <stdio.h> 
#include <stdlib.h> 
#include "zlib.h" 

#define FILE_TO_OPEN "text.txt" 

static char* readcontent(const char *filename, int* size) 
{ 
    char* fcontent = NULL; 
    int fsize = 0; 
    FILE* fp = fopen(filename, "r"); 

    if(fp) { 
     fseek(fp, 0, SEEK_END); 
     fsize = ftell(fp); 
     rewind(fp); 

     fcontent = (char*) malloc(sizeof(char) * fsize); 
     fread(fcontent, 1, fsize, fp); 

     fclose(fp); 
    } 

    *size = fsize; 
    return fcontent; 
} 

int main(int argc, char const *argv[]) 
{ 
    int input_size; 
    char* content_of_file = readcontent(FILE_TO_OPEN, &input_size); 

    printf("%d\n", input_size); 

    uLongf compressed_data_size; 
    char* compressed_data = malloc(sizeof(char) * (input_size * 10)); 

    int result = compress((Bytef*) compressed_data, (uLongf*)&compressed_data_size, (const Bytef*)content_of_file, (uLongf)input_size); 
    printf("%d\n", result); 

    return 0; 
} 
+0

попробуйте установить 'сжатый_data_size' в какое-то значащее значение; также я бы положил 'rb' в fopen –

ответ

1

Попробуйте

uLongf compressed_data_size = compressBound(input_size); 

compressBound должны быть доступны в zlib.

Также вы, вероятно, используете rb в fopen, как я уже упоминал в своем комментарии раньше.

+0

Он работает, спасибо. Можете ли вы объяснить мне значение этих чисел 1.001 и 12? Большое спасибо – pistacchio

+0

@pistacchio: кажется, что именно так вычисляется destlen; https://wiki.csc.calpoly.edu/491W11-HRI/browser/Examples/my_erratic/erratic_robot/player/build/player-svn/replace/compressBound.c?rev=3. Я столкнулся с этой функцией на некоторых своих страницах с образцами –

+0

О, хорошо, спасибо большое :) – pistacchio

2

fopen(filename, "rb"). Если вы находитесь в Windows, то b важно, чтобы избежать повреждения двоичных данных.

Используйте compressBound() в zlib вместо input_size * 10 и установите compressed_data_size перед тем, как позвонить compress(). (Вам не нужно и не нужно писать свой собственный compressBound().)

Смежные вопросы