[DRAFT] write the huffman data inside the .huff file

This commit is contained in:
Mylloon 2021-12-24 20:31:53 +01:00
parent ef1f0b0532
commit 6374c9e043
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

36
arbre.c
View file

@ -74,7 +74,7 @@ Entete *arbreVersListe(Arbre arbre, int taille, int *tailleTotale) {
} }
Entete *fichierVersListe(FILE *fichier, int *nombreLettresDansFichier, int *tailleTotale) { Entete *fichierVersListe(FILE *fichier, int *nombreLettresDansFichier, int *tailleTotale) {
char lettre = 'a'; char lettre = 'a'; // initalisation pour éviter un warning
Liste liste = NULL; Liste liste = NULL;
while (lettre != EOF) { while (lettre != EOF) {
lettre = fgetc(fichier); 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) { 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) { void decompression(FILE *entree, FILE *sortie) {