Como posso ler linha por linha usando a interface do Boost IOStreams para arquivos Gzip?
Consegui integrar as APIs Iostream de impulso para ler arquivos compactados. Segui a documentação na página de reforço e tenho o seguinte código até agora:
std::stringstream outStr;
ifstream file("file.gz", ios_base::in | ios_base::binary);
try {
boost::iostreams::filtering_istreambuf in;
in.push(boost::iostreams::gzip_decompressor());
in.push(file);
boost::iostreams::copy(in, outStr);
}
catch(const boost::iostreams::gzip_error& exception) {
int error = exception.error();
if (error == boost::iostreams::gzip::zlib_error) {
//check for all error code
}
}
O código funciona bem (por isso, ignore quaisquer erros de digitação e erros acima:)
Parece que o código acima lerá o arquivo completo e o armazenará na memória enquanto cria o filtering_istreambuf. Isso é verdade, da minha investigação parece-me assim? Se o arquivo for lido na memória, esse código pode ser um problema para arquivos grandes (é com isso que estou lidando). Meu código atual lê o gzipped usando a API gzgets do zlib linha por linha. Existe uma maneira de fazer leitura linha por linha usando APIs de aumento?