🎉 reLecture complète du fichier 🎉

This commit is contained in:
Mylloon 2021-12-27 11:08:13 +01:00
parent 2d8dfccb33
commit 5eab6a7c30
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

44
arbre.c
View file

@ -112,7 +112,7 @@ 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) {
int buffer = 0, tailleBufferActuelle = 0, sizeOfInt = sizeof(int) * 8; // *8 car "long unsigned int" d'après GCC int buffer = 0, tailleBufferActuelle = 0, sizeOfInt = sizeof(int) * 8; // *8 car quelque fois certains caractères sont mal encodés (en plus ça réduit la taille du fichier final)
char lettre = 'a'; // initialisation pour éviter un warning char lettre = 'a'; // initialisation pour éviter un warning
while (lettre != EOF) { // on parcours le fichier while (lettre != EOF) { // on parcours le fichier
lettre = fgetc(entree); lettre = fgetc(entree);
@ -157,8 +157,7 @@ Entete recuperationLettre(char lettre, Entete *enteteListe, int nombreLettresDan
} }
Arbre lectureDonnees(FILE *fichier, int *tailleTotale) { Arbre lectureDonnees(FILE *fichier, int *tailleTotale) {
int nombreLettresDansFichier; int nombreLettresDansFichier, lecture = 0; // bytes lues
int lecture = 0; // bytes lues
lecture += fread(&nombreLettresDansFichier, sizeof(int), 1, fichier); lecture += fread(&nombreLettresDansFichier, sizeof(int), 1, fichier);
lecture += fread(tailleTotale, sizeof(int), 1, fichier); lecture += fread(tailleTotale, sizeof(int), 1, fichier);
@ -177,18 +176,17 @@ Arbre lectureDonnees(FILE *fichier, int *tailleTotale) {
// Ajout de la lettre à l'arbre // Ajout de la lettre à l'arbre
Cellule *curseur = arbre; Cellule *curseur = arbre;
int gaucheOuDroite, mask = 1; // mask est le masque de bit appliqué pour savoir si on doit aller a la gauche ou a la droite de l'arbre int mask = 1; // mask est le masque de bit appliqué pour savoir si on doit aller a la gauche ou a la droite de l'arbre
mask <<= entete[i].longueur - 1; // décalage vers la gauche de la longueur de la lettre - 1 mask <<= entete[i].longueur - 1; // décalage vers la gauche de la longueur de la lettre - 1
for (int j = 0; j < entete[i].longueur; j++) { for (int j = 0; j < entete[i].longueur; j++) {
gaucheOuDroite = entete[i].code & mask;
entete[i].code <<= 1; // décalage de 1 vers la gauche pour éviter la segfault entete[i].code <<= 1; // décalage de 1 vers la gauche pour éviter la segfault
if (!gaucheOuDroite) { // gauche if (entete[i].code & mask) { // droite
if (curseur->gauche == NULL) curseur->gauche = allouerCellule('\0'); // on remplace NULL par le caractère correspondant
curseur = curseur->gauche;
} else { // droite
if (curseur->droite == NULL) curseur->droite = allouerCellule('\0'); // on remplace NULL par le caractère correspondant if (curseur->droite == NULL) curseur->droite = allouerCellule('\0'); // on remplace NULL par le caractère correspondant
curseur = curseur->droite; curseur = curseur->droite;
} else { // gauche
if (curseur->gauche == NULL) curseur->gauche = allouerCellule('\0'); // on remplace NULL par le caractère correspondant
curseur = curseur->gauche;
} }
} }
curseur->lettre = entete->lettre; // on assigne la bonne lettre correspondante curseur->lettre = entete->lettre; // on assigne la bonne lettre correspondante
@ -196,12 +194,36 @@ Arbre lectureDonnees(FILE *fichier, int *tailleTotale) {
free(entete); // on libère l'entête car on en a plus besoin free(entete); // on libère l'entête car on en a plus besoin
printf("%d bytes lus.\n", lecture); printf("%d bytes lus pour reconstruire l'arbre.\n", lecture);
return arbre; return arbre;
} }
void huffmanDepuisFichier(FILE *entree, FILE *sortie, Arbre arbre, int tailleTotale) { void huffmanDepuisFichier(FILE *entree, FILE *sortie, Arbre arbre, int tailleTotale) {
// TODO int mask = 1, buffer, bitsLus = 0, lecture = 0, sizeOfInt = sizeof(int) * 8;
int bitsMax = tailleTotale / sizeOfInt;
if(tailleTotale % sizeOfInt != 0) bitsMax++; // parce que c'est un arbre binaire
mask <<= sizeOfInt - 1; // on récupère le bon bit
Cellule * curseur = arbre;
for (int i = 0; i < bitsMax; i++) { // on parcours le fichier
lecture += fread(&buffer, sizeof(int), 1, entree);
for (int j = 0; bitsLus < tailleTotale && j < sizeOfInt; j++) {
if (curseur->lettre != '\0') { // update de l'arbre si on est sur une 'mini-racine'
fprintf(sortie, "%c", curseur->lettre); // on ajoute le caractères dans le fichier de sortie
curseur = arbre;
}
if(mask & buffer) curseur = curseur->droite; // droite
else curseur = curseur->gauche; // gauche
bitsLus++; // on incrémente bitsLus de 1
buffer <<= 1; // update du buffer
}
}
printf("%d bytes lus pour reconstruire le fichier.\n", lecture);
} }
void decompression(FILE *entree, FILE *sortie) { void decompression(FILE *entree, FILE *sortie) {