From 6374c9e043ffd8e22a96835fa6faed3a79b5d7d1 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Fri, 24 Dec 2021 20:31:53 +0100 Subject: [PATCH] [DRAFT] write the huffman data inside the .huff file --- arbre.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/arbre.c b/arbre.c index cac7a4c..7aa60c1 100644 --- a/arbre.c +++ b/arbre.c @@ -74,7 +74,7 @@ Entete *arbreVersListe(Arbre arbre, int taille, int *tailleTotale) { } Entete *fichierVersListe(FILE *fichier, int *nombreLettresDansFichier, int *tailleTotale) { - char lettre = 'a'; + char lettre = 'a'; // initalisation pour éviter un warning Liste liste = NULL; while (lettre != EOF) { lettre = fgetc(fichier); @@ -113,7 +113,39 @@ void enteteVersFichier(Entete *enteteListe, int nombreLettresDansFichier, int lo } void huffmanVersFichier(FILE *entree, FILE *sortie, Entete *enteteListe, int nombreLettresDansFichier) { - // TODO écriture des données dans le fichier + int buffer = 0, tailleBuffer = 0; + char lettre = 'a'; // initalisation pour éviter un warning + while (lettre != EOF) { + lettre = fgetc(entree); + Entete *entete = NULL; // rappel: entete représente une liste de caractères + for(int i = 0; i < nombreLettresDansFichier; i++) + if(enteteListe[i].lettre == lettre) { + entete = &enteteListe[i]; + break; + } + if (entete == NULL) { + printf("Incohérence entre l'entête généré et le fichier..."); + exit(1); + } + if (tailleBuffer + (*entete).longueur >= sizeof(int) * 8) { // écriture dans le fichier + // Modification du buffer + int aAjouter = (sizeof(int) * 8) - tailleBuffer; + buffer <<= aAjouter; + + // Ajout de la lettre + int tmp = (*entete).code >> ((*entete).longueur - aAjouter); + (*entete).longueur -= aAjouter; + + buffer |= tmp; + fwrite(&buffer, sizeof(int), 1, sortie); + + buffer = 0, tailleBuffer = 0; // reset du buffer + } + } + if (tailleBuffer > 0) { + buffer <<= (sizeof(int) * 8) - tailleBuffer; // décalage vers la gauche + fwrite(&buffer, sizeof(int), 1, sortie); + } } void decompression(FILE *entree, FILE *sortie) {