Как считать .gz файл линию за линией в C++?

Я имею 3 терабайта .gz файл и хочу считать его несжатое содержание линию за линией в программе C++. Поскольку файл довольно огромен, я не хочу загружать его полностью в памяти.

Кто-либо может отправить простой пример выполнения его?

20
задан Philipp Claßen 25 November 2016 в 18:14
поделиться

5 ответов

Библиотека zlib поддерживает распаковку файлов в памяти блоками, поэтому вам не нужно распаковывать весь файл, чтобы обработать его.

2
ответ дан 30 November 2019 в 00:35
поделиться

Для чего-то, что будет использоваться регулярно, вы, вероятно, захотите использовать одно из предыдущих предложений. В качестве альтернативы, вы можете сделать

gzcat file.gz | yourprogram

и попросить вашу программу читать из cin. Это распакует части файла в памяти по мере необходимости и отправит несжатый вывод на yourprogram.

11
ответ дан 30 November 2019 в 00:35
поделиться

Скорее всего, вам придется использовать deflate ZLib, пример доступен на их сайте

В качестве альтернативы вы можете взглянуть на BOOST C ++ wrapper

Пример со страницы BOOST (распаковывает данные из файла и записывает их в стандартный вывод)

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

int main() 
{
    using namespace std;

    ifstream file("hello.z", ios_base::in | ios_base::binary);
    filtering_streambuf<input> in;
    in.push(zlib_decompressor());
    in.push(file);
    boost::iostreams::copy(in, cout);
}
14
ответ дан 30 November 2019 в 00:35
поделиться

Вы не можете этого сделать, потому что *.gz не имеет "линий".

Если сжатые данные содержат новые строки, вам придется их распаковать. Не обязательно распаковывать все данные сразу, можно делать это частями и посылать строки обратно в основную программу, когда встречаются символы новой строки. *.gz можно распаковать с помощью zlib.

1
ответ дан 30 November 2019 в 00:35
поделиться

Chilkat ( http://www.chilkatsoft.com/ ) имеет библиотеки для чтения сжатых файлов из приложений C ++, .Net, VB, ....

0
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: