[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) {
|
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) {
|
||||||
|
|
Reference in a new issue