2013-02-28 3 views
0

У меня проблема с попыткой сжатия данных файла. Все работает до вызова сжатия, но это не сам вызов сжатия, поскольку перед ним возникает segfault. Показаны мой код будет сделать гораздо яснее:C++ получает ошибку seg перед тем, как ввести функцию

std::cout << "FILENAME: "; 
std::cin >> filename; 

if(!fileExists(filename)) 
{ 
    std::cout << "ERR: FILE NOT FOUND." << std::endl; 
    continue; 
} 

std::cout << "Compressing file data..."; 
writeFile(filename, zlib_compress(readFile(filename))); 
std::cout << " Done." << std::endl; 

В функции zlib_compress ...

std::string zlib_compress(const std::string& str) 
{ 
    std::cout << "DEBUG" << std::endl; 

    z_stream zs;      // z_stream is zlib's control structure 
    memset(&zs, 0, sizeof(zs)); 

    if (deflateInit(&zs, 9) != Z_OK) 
     std::cout << "deflateInit failed while compressing." << std::endl; 

    zs.next_in = (Bytef*)str.data(); 
    zs.avail_in = str.size();   // set the z_stream's input 

    int ret; 
    char outbuffer[1073741824]; 
    std::string outstring; 

    // retrieve the compressed bytes blockwise 
    do 
    { 
     zs.next_out = reinterpret_cast<Bytef*>(outbuffer); 
     zs.avail_out = sizeof(outbuffer); 

     ret = deflate(&zs, Z_FINISH); 

     if (outstring.size() < zs.total_out) 
     { 
      // append the block to the output string 
      outstring.append(outbuffer, zs.total_out - outstring.size()); 
     } 
    } while(ret == Z_OK); 

    deflateEnd(&zs); 

    if(ret != Z_STREAM_END) // an error occurred that was not EOF 
    { 
     std::ostringstream oss; 
     oss << "Exception during zlib compression: (" << ret << ") " << zs.msg; 
     std::cout << oss.str(); 
    } 

    return outstring; 
} 

Я знаю, я знаю, что функция должна работать, я просто C & P'd откуда-то попробовать.

Но дело это:

std::cout << "DEBUG" << std::endl; является никогда называется. Компилятор говорит, что отход от seg происходит отсюда:

std::string zlib_compress(const std::string& str) 
> { 

Но почему ...? Он работал раньше. Я просто не знаю, что пошло не так!

Редактировать: Выход отладчика.

#0 00000000 0x00402cbb in __chkstk_ms() (??:??) 
#1 004013BE zlib_compress(str=...) (C:\Users\***\Documents\Work\Programming\Compressor\z.cpp:5) 
#2 00401DDA _fu15___ZSt4cout() (C:\Users\***\Documents\Work\Programming\Compressor\main.cpp:80) 
+0

Как определить 'имя файла '? –

+0

Перед этим кодом, как 'std :: string filename;' – 2013-02-28 01:32:48

+0

Можете ли вы запустить его через отладчик? С чем вы работаете? –

ответ

6

char outbuffer [1073741824];

Это слишком большой, чтобы поместить в стек

+0

Woah этого не заметил. Лемм делает это меньше. – 2013-02-28 01:34:32

+0

Хотя проблема все еще стоит. – 2013-02-28 01:35:22

+0

Да, это гигабайт. Чтобы разработать немного, если вы получаете ошибки до того, как какой-либо код выполняет функцию, это, вероятно, ошибка выделения памяти. –

0

Вы принимаете постоянную ссылку на строку в качестве параметра в вашем zlib_compress - вам необходимо убедиться, что память доступна (независимо от того, возвращается из вашего ReadFile) в ваш zlib_compress. Было бы хорошо, если бы вы могли поделиться прототипом вашей функции readFile.

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