[DRAFT] write the huffman data inside the .huff file
This commit is contained in:
parent
ef1f0b0532
commit
6374c9e043
1 changed files with 34 additions and 2 deletions
36
arbre.c
36
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) {
|
||||
|
|
Reference in a new issue