У меня есть функция 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++
.
Это справедливо в 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
.
vector<char>
и замените вашfwrite
наvector.insert(vector.end(), outbuffer, outbuffer+len);