C - Как я могу распаковать распаковать куски файла в буфер памяти

0

У меня есть функция C которая распаковывает файл gzip в другой файл:

bool gzip_uncompress(const std::string &compressed_file_path,std::string &uncompressed_file_path)
{
    char outbuffer[1024*16];
    gzFile infile = (gzFile)gzopen(compressed_file_path.c_str(), "rb");
    FILE *outfile = fopen(uncompressed_file_path.c_str(), "wb");
    gzrewind(infile);
    while(!gzeof(infile))
    {
        int len = gzread(infile, outbuffer, sizeof(outbuffer));
        fwrite(outbuffer, 1, len, outfile);
    }
    fclose(outfile);
    gzclose(infile);
    return true;
}

И это хорошо работает.

Однако я хотел бы записать распакованные куски буфера в новый char[] вместо выходного файла. Но я не знаю, как определить длину полного распакованного файла, чтобы объявить буфер char[?] Для полного вывода.

Можно ли изменить указанную выше функцию для распаковки файла в память? Я предположил, что я распакую его в char[], но, может быть, vector<char> лучше? Это имеет значение? Для меня работает либо C либо C++.

  • 0
    Используйте vector<char> и замените ваш fwrite на vector.insert(vector.end(), outbuffer, outbuffer+len);
  • 0
    Предпочитаю вектор <char>
Показать ещё 2 комментария
Теги:
gzip

1 ответ

3
Лучший ответ

Это справедливо в C++:

vector<char> gzip_uncompress(const std::string &compressed_file_path)
{
    char outbuffer[1024*16];
    gzFile infile = (gzFile)gzopen(compressed_file_path.c_str(), "rb");
    vector<char> outfile;
    gzrewind(infile);
    while(!gzeof(infile))
    {
        int len = gzread(infile, outbuffer, sizeof(outbuffer));
        outfile.insert(outfile.end(), outbuffer, outbuffer+len);
    }
    gzclose(infile);
    return outfile;
}

Вы также outbuffer полностью отказаться от outbuffer и вместо этого изменить размер вектора перед каждым чтением и чтением непосредственно в байтах, добавленных изменением размера, что позволит избежать копирования.

Версия C должна использовать malloc и realloc.

  • 0
    Похоже, вектор <char> определенно подходит! Спасибо, это очень помогло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню