Rust décompresser un fichier GZip

Problème de retour à la ligne

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous et à toutes :)

J’ai commencé que très récemment à apprendre ce merveilleux langage qu’est leRust . Je tente faire un petit programme qui permet de décompresser les formats les plus courants. J’ai réussis à gérer le cas du zip mais le gzip me résiste.

Voici le code où je suis arrivé en première version

extern crate libflate;

use std::io;
use std::fs::File;
use libflate::gzip::Decoder;

fn main() {

    let file = File::open("/tmp/source.gz");
    let mut dest = File::create("/tmp/dest.txt").unwrap();
    let mut decoder = Decoder::new(file).unwrap();
    io::copy(&mut decoder, &mut dest).unwrap();

}

Le /tmp/source.gz contient un unique fichier lorem.txt contenant 40 lignes séparées chacune par une ligne vide. Chaque ligne se termine par un "CRLF".

Mon /tmp/dest.txt contient bien mes 40lignes mais sans les retours à la ligne, je n’ai qu’un très longue chaînes de caractères.

En vérifiant avecx un éditeur hexadécimale je me suis aperçu de la disparition des CRLF.

J’ai tenté une seconde version:

extern crate libflate;

use std::io;
use std::fs::File;
use libflate::gzip::Decoder;

fn main() {

    let file = File::open("/tmp/source.gz");
    let mut dest = File::create("/tmp/dest.txt").unwrap();
    let decoder = Decoder::new(file).unwrap();
    let mut buffer = io::BufReader::new(decoder);
    for mut line in io::BufReader::new(decoder).lines() {
        let line = line.unwrap();
        dest.write(line.as_bytes());
    }

}

Mais même problème pas de CRLF :(

Si vous avez des idées je suis preneur :)

Édité par Akanoa

+0 -0
Auteur du sujet

Salut, J’ai trouvé la solution à mon problème et appris à lire une doc :p.

Je wrappais mon decoder gzip dans une structure et j’implémentais le trait Into<T> -> File sur cette structure via un BufReader::lines. Sauf que comme écrit noir sur blanc pour quelqu’un doté d’yeux en état de marche il y a écrit:

Returns an iterator over the lines of this reader.

The iterator returned from this function will yield instances of io::Result<String>. Each string returned will not have a newline byte (the 0xA byte) or CRLF (0xD, 0xA bytes) at the end.

De ce fait les octets de \n ou \r\n disparaissaient avant d’arriver à mon decoder

Solution virer le BufReader et faire un Decoder::new du fichier au lieu du buffer ^^

J’espère que ça pourra aider quelqu’un d’autre un jour :)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte