Jump to content
Sign in to follow this  
zecapistolas

Zlib ou boost::iostreams::zlib

Recommended Posts

zecapistolas

Viva,

Preciso de utilizar uma biblioteca externa para ler ficheiros gz. Depois de uma pesquisa rápida pela net descobri que zlib seria a melhor opção.

Um pequeno exemplo do uso do zlib:

int main() {
        gzFile infile = gzopen("ficheiro_input", "rb");
FILE *outfile = fopen("ficheiro_output", "wb");
if (!infile || !outfile) return -1;

char buffer[128];
int num_read = 0;
while ((num_read = gzread(infile, buffer, sizeof(buffer))) > 0) {
	fwrite(buffer, 1, num_read, outfile);
	break;
}

gzclose(infile);
fclose(outfile);

        return 0;
}

Está perfeitamente a funcionar.

No entanto também li que utilizando a boost poderia utilizar o zlib, pequeno exemplo:

int main() {
    ifstream file("ficheiro_input", ios_base::in | ios_base::binary);

    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    boost::iostreams::flush(in);
    in.push(boost::iostreams::zlib_decompressor());
    in.push(file);

    boost::iostreams::copy(in, cout);

return 0;
}

Não estou a conseguir utilizar porque ao executar dá o seguinte erro:

main: /usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr<T>::operator->() const [with T = boost::iostreams::detail::chain_base<boost::iostreams::chain<boost::iostreams::input, char, std::char_traits<char>, std::allocator<char> >, char, std::char_traits<char>, std::allocator<char>, boost::iostreams::input>::chain_impl]: Assertion `px != 0' failed.

Se já usaram o que aconselham, apenas zlib ou zlib através da boost ?  🤔

Outro aspecto importante, o ficheiro gz que vou ler ter cerca de 250MB, qual a melhor de avaliar o problema? O zlib tem algum método para ler em blocos, ou algo parecido? Para poder ir lendo o gz e ir analisando os dados....

cumps  :(

Share this post


Link to post
Share on other sites
zecapistolas

Ainda ninguém aqui no fórum usou uma das destas bibliotecas?  ;)

cumps  ;)

Share this post


Link to post
Share on other sites
lordfokas

Eu diria só zlib, visto que o Boost faz o mesmo, mas carrega-te o código de templates e tralha que provavelmente não vais precisar.

Assumo que não queres um executável mais pesado que o estritamente necessário.

Nunca usei nada disso, mas pelo que tenho lido acerca do Boost, e pelo que li do teu tópico, diria que mais vale ficares-te pelo zlib.

Cumps  ;)

Share this post


Link to post
Share on other sites
zecapistolas

Eu diria só zlib, visto que o Boost faz o mesmo, mas carrega-te o código de templates e tralha que provavelmente não vais precisar.

Assumo que não queres um executável mais pesado que o estritamente necessário.

Nunca usei nada disso, mas pelo que tenho lido acerca do Boost, e pelo que li do teu tópico, diria que mais vale ficares-te pelo zlib.

Cumps  ;)

E viste ou sabes de alguma coisa como posso ler múltiplos blocos ou bloco a bloco? Esta é a minha dúvida, como implementar eficientemente a leitura de um ficheiro gz!

cumps  ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.