Декомпрессор gzip на C++, библиотека zlib.h

155
05 января 2020, 15:20

Доброго времени суток!

Не так давно начал осваивать С++ и столкнулся с проблемой. Необходимо разархивировать довольно большое число файлов *.GZ. В связи с этим облазил интернет, нашел библиотеку zlib.h, установил её через configure. И после компиляции, а именно g++ file.cpp -o file -lz получил первые результаты. На самом деле на это у меня ушёл чуть ли не весь день и сейчас задача разархивировать хотя бы 1 файл совсем поставила меня в тупик.

Дело в том, что большинство примеров, которые приводятся на просторах интернета не работали, а один из них выдавал ошибку, мол формат не верный. Это странно, в конце концов эти файлы были получены непосредственно с noaa, поэтому в правильности формата я уверен на все 100%. Например в баше через gunzip они распаковываются на ура.

Собственно нашёл небольшой, в сравнении с остальными, кусочек кода, но он работал. Вот только не так, как мне хотелось бы. Файл действительно стал заполняться информацией, но вместо ожидаемых 2.2 мб, я получал на выходе 14,2 Кб. Так как в языке я совсем не силен, то прошу указать мне, в чем же моя ошибка и как мне получить желаемый результат? Внутри архива находится бинарный файл.

#include "zlib.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
const static int KILOB = 16384;
using namespace std;
int main(int argc, char **argv)
{
 char cb[KILOB];
 string arch = "/home/cat/Projects/selection_l1b_format_noaa/TEMP/NSS.AMAX.NK.D11172.S2050.E2244.B6813941.GC.gz";
 FILE *outfile = fopen("/home/cat/Projects/selection_l1b_format_noaa/TEMP/AMAX.GC", "wb");
 gzFile gfile = gzopen(arch.c_str(), "rb");
 int len = 0;
 int count = 0;
 do
 {
    len = gzread(gfile, cb, KILOB);
    if (len < KILOB)
        cb[len] = 0;
    count++;
    cout<<"len="<<len<< "   # "<<count <<endl;
    fprintf(outfile, "%s", cb);
 } while (len == KILOB);
fclose(outfile);
gzclose(gfile);
}

Если это имеет значение,то моя система Linux Mint 19.1 Код пишу в VSCode, компилятор gcc. И судя по всему я не пользуюсь Qt.

READ ALSO
Как записать wchar_t в файл?

Как записать wchar_t в файл?

Вывод в терминал я понял как делать

133
Как выбрать объект через form:select?

Как выбрать объект через form:select?

Имеются такие классы

128
Дженерики в Java

Дженерики в Java

Возможно ли в теории на этапе компиляции обнаружить некорректное преобразование объекта одного класса в объект другого?

110