🎉 reLecture complète du fichier 🎉
This commit is contained in:
parent
2d8dfccb33
commit
5eab6a7c30
1 changed files with 33 additions and 11 deletions
44
arbre.c
44
arbre.c
|
@ -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) {
|
||||||
|
|
Reference in a new issue