Compression / decompression selon l'algorithme lempelziv 78v

Description

Salut à vous tous;
Ce programme entièrement écrit en C, permet la compression et la décompression selon l'algorithme LempelZiv78.

Cet algorithme génère son propre dictionnaire au fur et à mesure qu'on avance dans la lecture du fichier source (pour la compression et la décompression).

Le projet contient en tout 7 fichiers, dont:

- Un fichier principal 'main.c', contient la fonction main()
- Deux fichiers 'ListeChaine.c' et 'ListeChaine.h', contiennent des fonctions permettant la définition
et l'utilisation d'une liste chainée
- Deux fichiers 'LempelZiv.c' et 'LempelZiv.h', définit la fonction de compression et celle de la décompression selon l'algorithme de LempelZiv-v78
- Deux fichiers 'ChaineBit.c' et 'ChaineBit.h', définissent les fonctions pour le traitement, l'écriture et la lecture à partir d'un fichier au niveau des bits

La fonction de compression marche à merveille (son résultat est correcte);
La fonction de décompression marche pour des fichiers de faible taille, mais dés que les fichiers deviennent de grande taille, la fonction donne des résultat incorrect.

Source / Exemple :


Voici la fonction de décompression, elle fait appelle à d'autres fonctions du projet: 

void decompression(char *Src, char *Dest){
    FILE *fichSrc=fopen(Src,"r");
    FILE *fichDest=fopen(Dest,"w");
    liste *tete=NULL,*p;
    int i=0,nbre,ind;
    long tailleFich,pf;
    char car,inter1[200],inter2[200];

    fseek(fichSrc,0,SEEK_END);
    tailleFich=ftell(fichSrc);
    fseek(fichSrc,0,SEEK_SET);

    while((pf=ftell(fichSrc)) < tailleFich){
        i++;
        strcpy(inter1,"");
        strcpy(inter2,"");
        nbre=ceil(log(i)/log(2));	        // l'indice de la chaine est code sur nbre bits

        lectBitFich(fichSrc,nbre,&ind,&car);

        inter1[0]=car;
        inter1[1]='\0';

        if(ind!=0){
            p=getListe(tete,ind-1);          //p pointe sur l'element d'indice j
            strcpy(inter2,p->chaine);
            strcat(inter2,inter1);
            strcpy(inter1,inter2);
        }

        tete=ajoutListe(tete,ind,inter1);
        fprintf(fichDest,"%s",inter1);
    }

    printf("\n___________________________AFFICHAGE LISTE DECOMPRESSION_______________________\n");
    afficheListe(tete);
    printf("\nFichier de taille %ld\n",tailleFich);
    printf("\nListe de Decompression de taille %d\n",tailleListe(tete));

    tete=supprimeListe(tete);

    fclose(fichSrc);
    fclose(fichDest);
}

Conclusion :


Moi, je pense que la fonction bugs lors de l'appel de la fonction "lectBitFich(fichSrc,nbre,&ind,&car)",

Si vous avez une façon meilleure pour la lecture bit à bit à partir du fichier, et si vous avez des suggestions n'hésitez pas !!!

Merci d'avance !!!

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.