IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Programme Compression de fichiers selon Huffman


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut Programme Compression de fichiers selon Huffman
    Bonjour à tous,

    voilà, je suis en train de développer dans le cadre de mes études un programme permettant de compresser/décompresser un fichier texte selon le codage de Huffman. Je n'ai pas rencontré de problèmes particuliers de fonctionnement mais j'ai un souci que je n'arrive pas à résoudre. Le programme traite la majeure partie des caractères sauf certains qu'il ne prend pas en compte. Par exemple le caractère "é" n'est pas pris en compte. En fait, tous ces caractères non lus, correspondent à un endroit précis de la table ascii. Je n'ai plus en tête le nombre précis, mais par exemple, à partir du 150ème jusqu'à la fin de la table ascii, ces caractères ne sont plus pris en compte par mon programme. En connaissez-vous la raison ? Si oui, pouvez vous me donner une solution pour résoudre ce problème ??

    Merci d'avance !

  2. #2
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    On peut aussi utiliser des variables Unicode.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    càd, je ne connais pas ce genre de variables ?

  4. #4
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est le type "wchar_t" qui possède ses propre fonctions.
    Mais c'est peut être un peu lourd dans ce cas.

    A partir du 150e c'est bizarre, 127 aurait semblé plus "normal".
    Normalement le ASCII étendu va jusqu'à 255, il tient dans un char.
    Avec quelle fonction sont lus les caractères?

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Lord Van
    Bonjour à tous,

    voilà, je suis en train de développer dans le cadre de mes études un programme permettant de compresser/décompresser un fichier texte selon le codage de Huffman. Je n'ai pas rencontré de problèmes particuliers de fonctionnement mais j'ai un souci que je n'arrive pas à résoudre. Le programme traite la majeure partie des caractères sauf certains qu'il ne prend pas en compte. Par exemple le caractère "é" n'est pas pris en compte. En fait, tous ces caractères non lus, correspondent à un endroit précis de la table ascii. Je n'ai plus en tête le nombre précis, mais par exemple, à partir du 150ème jusqu'à la fin de la table ascii, ces caractères ne sont plus pris en compte par mon programme. En connaissez-vous la raison ? Si oui, pouvez vous me donner une solution pour résoudre ce problème ??

    Merci d'avance !
    J'ai eu une fois ce genre de problème parce que j'avais oublié de déclarer explicitement les variables de types char en unsigned char.

    Sinon, il faudrait voir un peu de code et que tu tentes de préciser à quel endroit spécifique il y a un problème...

    Jc

  6. #6
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Je ne connais pas le codage Huffman, mais qu'est-ce qui empêche de traiter le fichier comme un simple fichier binaire ?

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Huffman se base sur du texte et la répétition de caractère.

  8. #8
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par seriousme
    Huffman se base sur du texte et la répétition de caractère.
    Et alors ? Pourquoi cela ne marcherai pas avec des données de type quelconque ?

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lord Van
    Par exemple le caractère "é" n'est pas pris en compte. En fait, tous ces caractères non lus, correspondent à un endroit précis de la table ascii.
    La table ASCII couvre les valeurs de 0 à 127. Aucune chance que é en fasse partie... Ou alors on ne parle pas de 'table ASCII'...

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par crocodilex
    Et alors ? Pourquoi cela ne marcherai pas avec des données de type quelconque ?
    Un fichier compressé 'Huffman' est un fichier binaire... En fait, on a attribué à chaque caractère un code de 2 à n bits selon son occurence dans le texte... (très fréquent : code court, moins fréquent, code long).

    C'est assez rusé comme codage... On utilise la table d'occurence pour construire un arbre pour encoder... La table d'occurence est transmise et sert à reconstruire l'arbre distant qui est utilisé pour le décodage...

  11. #11
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Un fichier compressé 'Huffman' est un fichier binaire... En fait, on a attribué à chaque caractère un code de 2 à n bits selon son occurence dans le texte... (très fréquent : code court, moins fréquent, code long).

    C'est assez rusé comme codage... On utilise la table d'occurence pour construire un arbre pour encoder... La table d'occurence est transmise et sert à reconstruire l'arbre distant qui est utilisé pour le décodage...
    Voilà qui est plus clair. Je vais faire des recherches plus approfondies pour ne pas mourrir bête.
    Merci pour l'info...

  12. #12
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ou alors on ne parle pas de 'table ASCII'...
    Mais on parle bien de "ASCII étendu" quand le codage se fait sur 8 bit et non 7 pour le ASCII classique.
    La page de code 850 le gère.

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par seriousme
    Mais on parle bien de "ASCII étendu" quand le codage se fait sur 8 bit et non 7 pour le ASCII classique.
    La page de code 850 le gère.
    Il y a des dizaines de tables de codages toutes plus incompatibles les unes les autres qui utilisent le 8ème bit... C'est déjà la guerre chez Microsoft entre DOS (IBM-PC8 dit 'OEM') et Windows (iso-je ne sais plus quoi dit 'ANSI')...

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    Je vais vous envoyer la parti de mon code qui lit les caractères !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // Declaration des variables
     
    int ascii[255];
    int i,j;
    char c;
    FILE *fch=NULL; // fichier source qui est un fichier texte
    FILE *fch2=NULL; //fichier de destination
     
    //ces deux fichiers sont respectivement ouvert et créé
     
    //Affichege contenu du fichier & comptage caractère
     
    do{
          fread (&c,sizeof(char),1,fch);
          if(feof(fch) != 1) {
               ascii[c] ++;
    }
    }
    while(!feof(fch));
    fclose(fch);
     
    // Sauvegarde Tableau occurrence dans le fichier de destination
     
    for(i=0;i<255;i++){
          j=ascii[i];
          fwrite(&j,sizeof(int),1,fch2);
    }
    Par rapport à ce qu'a dit l'un d'entre vous, je devrais peut-être écrire "sizeof(unsigned char)" à la place de "sizeof(char)" dans mon fread et dans mon fwrite ?

    Merci d'avance

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Pour lire des caractères :
    • ouvrir en mode texte
    • définir c en int
    • lire avec une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((c = fgetc(fp)) != EOF)
    {
    }
    compter dans un tableau de unsigned long (on ne sait pas quelle est la longueur du texte...) Vérifier que les compteurs ne débordent pas. L'index étant compris entre 0 et 255, le tableau doit avoir 256 éléments...

  16. #16
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 41
    Points : 16
    Points
    16
    Par défaut
    En remplaçant les char par des unsigned char, ça m'a l'air de fonctionner correctement maintenant ! Pensez vous que je dois tt de même appliquer votre solution ?

    merci

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lord Van
    En remplaçant les char par des unsigned char, ça m'a l'air de fonctionner correctement maintenant ! Pensez vous que je dois tt de même appliquer votre solution ?
    Oui, ton code est erroné. Il ne détecte pas les erreurs de lectures (il part en boucle infinie...) De plus, le fread() est beaucoup trop compliqué pour lire 1 caractère. fgetc() est fait pour ça...

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/07/2008, 12h35
  2. Réponses: 3
    Dernier message: 25/08/2007, 14h35
  3. lister des fichiers selon des critères
    Par Corben dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 18/10/2005, 17h52
  4. Compression de fichiers
    Par BilTCD dans le forum Windows
    Réponses: 2
    Dernier message: 03/08/2005, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo