begin process at 2012 05 29 09:11:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

huffman


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

huffman

mardi 25 janvier 2005 à 16:07:53 | huffman

totomus

Salut tou tle monde

J'ai trouvé un petit programme sur le site à propos de la compression de huffmann, mais malheureusement, comme je suis débutant dans la programmation j'ai un peu de mal à tout comprendre.
C'est pourquoi j'aimerai savoir s'il y a quelqun qui pourrai m'aider en me mettant des commentaires sur le programme..

"

struct arbre
{
    unsigned char m;
    unsigned long z;
    struct arbre *pere, *g, *d;
};

struct arbre ar[512], *deb;



void EDIFICE();
void CMP(FILE *e, struct arbre *h, struct arbre *fils);
void ECRIRE(FILE *e, int b);
char oct;
int oct1, p;



//------------------------------------------------------------------------------------

void EDIFICE()
{
    int i, n1 = 256;
    while(1)
    {
        struct arbre *u = NULL, *v = NULL;
        for (i=0; i<n1; i++)
            if (ar + i != u)
                if ((ar[i].z > 0) && (ar[i].pere == NULL))
                    if ((u == NULL) || (ar[i].z < u->z))
                    {
                    if ((v == NULL) || (u->z < v->z))
                        v = u;
                    u = ar + i;
                    }
                    else if ((v == NULL) || (ar[i].z < v->z))
                        v = ar + i;
        if (v == NULL)
        {
            deb = u;
            break;
        }
    u->pere = ar + n1;
    v->pere = ar + n1;
    ar[n1].z = u->z + v->z;
    ar[n1].d = u;
    ar[n1].g = v;
    n1++;
    }
}


//------------------------------------------------------------------------------------


void CMP(FILE *e, struct arbre *h, struct arbre *fils)
{
    if (h->pere != NULL)
    CMP(e, h->pere, h);
    if (fils)
    {
        if (fils == h->d)
            ECRIRE(e, 0);
        else if (fils == h->g)
            ECRIRE(e, 1);
    }
}


//------------------------------------------------------------------------------------


void ECRIRE(FILE *e, int b)
{
    if ((p == 8) || (b == -1))
    {
        fputc(oct, e);
        p = 0;
    }
    oct = (oct << 1) | b;
    p++;
}


//------------------------------------------------------------------------------------

int DCMP(FILE *s, struct arbre *h)
{
    while (h->d != NULL)
        if (LIRE(s))
            h = h->g;
        else
        h = h->d;
    return( h->m );
}


//------------------------------------------------------------------------------------


int LIRE(FILE *s)
{
    int r;
    if (p == 8)
    {
        oct1 = fgetc(s);
        p = 0;
    }
    r = oct1 & 0x80;
    oct1 <<= 1;
    p++;
    return(r);
}


//------------------------------------------------------------------------------------


int compresse ( char entree[255], char sortie[255] )
{
    FILE *s, *e;
    int a, c, f = 0;
    unsigned char z;
    unsigned long n = 0;

    if ( ( (s = fopen(entree,"rb") )== NULL))
    {
        return 601;
    }
    if (((e = fopen(sortie,"wb")) == NULL))
    {
        return 602;
    }

    while (((c = fgetc(s)) != EOF))
        {
            c &= 255;
            if (ar[c].z == 0)
            {
                ar[c].m=c;
                f++;
            }
        ar[c].z++;
        n++;
        }
        fwrite(&n, sizeof(n), 1, e);
        fwrite(&f, sizeof(f), 1, e);
        for (c=0; c<256; c++)
        {
            if (ar[c].z > 0)
            {
                fwrite(&ar[c].m, sizeof(char), 1, e);
                fwrite(&ar[c].z, sizeof(unsigned long), 1, e);
            }
        }
    EDIFICE();
    fseek(s, 0L, 0);
    while ((c=fgetc(s)) != EOF)
        CMP(e, ar+(c&255), NULL);
    ECRIRE(e, -1);

    fclose (e);
    fclose(s);
    return 100;

}

//------------------------------------------------------------------------------------


int decompresse ( char entree[255], char sortie[255] )
{
    FILE *s, *e;
    int a, c, f = 0;
    unsigned char z;
    unsigned long n = 0;

    if ( ( (s = fopen(entree,"rb") )== NULL))
    {
        return 701;
    }
    if (((e = fopen(sortie,"wb")) == NULL))
    {
        return 702;
    }
    p = 8;
        fread(&n, sizeof(n), 1, s);
        fread(&f, sizeof(f), 1, s);
        while(f--)
        {
            fread(&z, sizeof(char), 1, s);
            ar[z].m = z;
            fread(&ar[z].z, sizeof(unsigned long), 1, s);
        }
        EDIFICE();
        while (n--)
            fputc(DCMP(s, deb), e);
    fclose (e);
    fclose(s);
    return 100;
}


//------------------------------------------------------------------------------------


main ()
{
    int choix;
    char entree[255],sortie[255];

    do {
    printf ("Compression de Huffman\n"
        "======================\n\n"
        "\t1 - Compresser\n"
        "\t2 - Decompresser\n"
        "\t3 - Quitter\n"
        "Entrez votre choix : ");
    scanf ("%d",&choix);
    switch (choix)
    {
        case 1 : printf ("Entrez le nom du fichier source : ");
        scanf ("%s",entree);
        sprintf (sortie,"%s.huf",entree);
        compresse (entree,sortie);
        break;

        case 2 : printf ("Entrez le nom du fichier compressé : ");
        scanf ("%s",entree);
        sprintf (sortie,"%s",entree);
        sortie[strlen(sortie) - 4] = '\0';
        decompresse (entree,sortie);
        break;
    }
    }
    while (choix != 3 );
}


"
Merci d'avance
++
Troylen
mardi 25 janvier 2005 à 18:02:59 | Re : huffman

coucou747

Administrateur CodeS-SourceS
euh... je ne connais pas ce programme, mieux vaut que u demandes à l'auteur... Tu veux comprendre quoi ? comment fonctionne huffman ? (t'as un numéro de login la dessus, si je le retreouve, je t'indiquerais le n° et les liens...) ou comment fonctionne ce programme ? In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happyhttp://coucou747.hopto.org


Cette discussion est classée dans : int, char, ar, sortie, entree


Répondre à ce message

Sujets en rapport avec ce message

lire dans un fichier [ par skeul ] Bonjour,je rencontre qqs difficultés a faire une fonction qui lit un fichier et qui rentre la chaine de caractere dans un tableauy a comme un probleme plantage inexpliqué [ par graall ] bonjour, j'ai un problème avec ce code :     getch();     FILE *pHtml;     int nb_char = 0;     bool sortie = false; Copier un fichier. [ par open ] Bonjour,j'ai trouver plein de source sur ce site et aucune ne fonctionne. Je sais pas pourquoi. Je compile avec dev-c++ et toutes les sources me trouv erreur de pointeur [ par africanwinners ] Bonsoir j'ai concu un programme c qui permet de lire un fichier,de supprimer les doublons (les doubles) mais il y a des problèmes lors de la lecture d Allocation dynamique tableau 2D : erreur de seg [ par noname001 ] Bonjour à tous, [^^happy13] j'aimerais faire appel à vos lumières concernant deux codes. Ils ont tous les deux pour but de créer un tableau 2D dynami Error LNK2019 [ par issam000000 ] bonjour ,je suis débutant en programmation , je  arrive pas a résoudre cette erreur , quand je compile tout ce passe bien , 0 erreur 0 avertissement , SDL et windows.h sous sygwin [ par agent933 ] salut je travaille en ce moment sur un programme en langage.grosso modo jutilise le port serie pour recevoir donnees et ensuite utilise une interface convertsion int en unsigned char [ par avg ] Salut tout le monde j'ai une souci pour convertir un int en unsigned char[] voir le code c++ qui affiche l'erreur [code=cpp]int a=100; unsigned char Tableaux - Gestion dynamique de la mémoire [ par Smanyx ] Salut ! Je voudrais écrire un programme qui accepte des noms saisis au clavier et les amasse dans un tableau. Comme les noms sont entrés dans un bouc


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales