begin process at 2012 05 28 19:18:12
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

compression de huffman urgent svp


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

compression de huffman urgent svp

dimanche 5 décembre 2004 à 14:05:17 | compression de huffman urgent svp

bundy_boy

Bonjour voila, j'essai d'implémenter la compression de huffman dans un archiveur (qui lui fonctionne très bien), j'ai testé deux algorithmes de huffman (dont un présent sur ce site) et a chaque fois c'est pareille: a la décompression, ca me rajoute un ou deux caractère a la fin du fichier qui n'on rien a faire la ! J'ai biensur testé indépendement de mon archiveur. Quelqu'un sait d'ou cela peut venir ?? voici un des deux codes que j'ai testé:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>



struct arbre
{
unsigned char m;
unsigned long z;
struct arbre *pere, *fg, *fd;
};

struct arbre ar[512], *deb;



void tableau(void);
void code(FILE *e, struct arbre *h, struct arbre *fils);
void ecrire(FILE *e, int b);
int lire(FILE *s);
char octet;
int octet1, p;





void tableau(void)
{
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].fd = u;
ar[n1].fg = v;
n1++;
}
}




void code(FILE *e, struct arbre *h, struct arbre *fils)
{
if (h->pere != NULL)
code(e, h->pere, h);
if (fils)
{
if (fils == h->fd)
ecrire(e, 0);
else if (fils == h->fg)
ecrire(e, 1);
}
}



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



int decode(FILE *s, struct arbre *h)
{
while (h->fd != NULL)
if (lire(s))
h = h->fg;
else
h = h->fd;
return( h->m );
}



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



int compression(FILE *s)
{
FILE *e;
int c, f = 0;
unsigned long n = 0;

/*if ((s = fopen(entree,"rb"))==NULL) {printf("fichier vide\n");return 0;};*/
e = fopen("temp","wb");

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);
}
}
tableau();
fseek(s, 0L, 0);
while ((c=fgetc(s)) != EOF)
code(e, ar+(c&255), NULL);
ecrire(e, -1);

fclose(e);
fclose(s);
return 0;

}

int decompression(FILE *s)
{
FILE *e;
int f = 0;
unsigned char z;
unsigned long n = 0;
e = fopen("temp","rb");

p = 8;
fread(&n, sizeof(n), 1, e);
fread(&f, sizeof(f), 1, e);
while (f--)
{
fread(&z, sizeof(char), 1, e);
ar[z].m = z;
fread(&ar[z].z, sizeof(unsigned long), 1, e);
}
tableau();
while (n--){
fputc(decode(e, deb), s);
}
fclose(e);
fclose(s);
return 0;
}
dimanche 5 décembre 2004 à 14:27:14 | Re : compression de huffman urgent svp

coucou747

Administrateur CodeS-SourceS
t'as qu'a écrire deux caractères de moins ^^
dimanche 5 décembre 2004 à 14:42:09 | Re : compression de huffman urgent svp

vecchio56

Administrateur CodeS-SourceS
Je n'ai pas lu ton code, mais ca vient sans doute du fait que dans le fichier compressé, tous les bits ne sont pas significatifs (par exemple il tu peux en avoir que 2 a lire)
dimanche 5 décembre 2004 à 14:59:31 | Re : compression de huffman urgent svp

coucou747

Administrateur CodeS-SourceS
2 bits pour "il" ça m'étonnerais... ça voudrait dire que tu n'as que deux lettres dans ton texte...
dimanche 5 décembre 2004 à 15:11:18 | Re : compression de huffman urgent svp

vecchio56

Administrateur CodeS-SourceS
Oui j'ai écrit un il en trop dans ma derniere phrase

par exemple tu peux n'en avoir que 2 à lire
dimanche 5 décembre 2004 à 15:18:21 | Re : compression de huffman urgent svp

coucou747

Administrateur CodeS-SourceS
deux, oui c'est exact, le e pou l'espace dans un mail par exemple.
dimanche 5 décembre 2004 à 15:21:47 | Re : compression de huffman urgent svp

aardman

Membre Club
Salut,
Comme vecchio56 je pense que ca doit venir de la mauvaise gestion du nombre de bit de bourrages ajouté a la fin du fichier compressé.


Cette discussion est classée dans : arbre, int, void, ar, struct


Répondre à ce message

Sujets en rapport avec ce message

Probleme de reception dans un serveur visual C++ pour windows [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi.voici les source du client et du serveurLe Serveur équation et tableaux [ par cabarrus ] je ne trouve pas l'erreur dans mon programme?#include#includeint deltanul(int);float deltainf(float);float deltasup(float);void main(void){float a,b,c void et int [ par xionoxid ] SalutC koi la difference entre unvoid a;et int a; ?? Snake tsssssssssss aidez moiiiiiiii [ par AmK ] Salut ,Je suis en train de coder un snake et la je crois avoir bien compris le principe de l'algo mais niveau code ça foire je sais pas pourquoi voila Fch. Header :: CONIO.H [ par TontOnDuWeb ] Pour ce que ca interesse (avec vc++ les fonctions suivantes e sont pas incluse (du moins je crois...))>>#if !defined(__CONIO_H)#define __CONIO_H#if !d pb de retour( du tableau) de ma fonction [ par airwann ] bonjour,j ai un problème comment dois je modifier l'entête de ma fonction pour recupérer le tableau de structure 3 d alloué dynamiquementmerci d avanc class.... [ par Tautau ] voila j'ai un petit prob lors de ma compilation et j'ai un test dessus lundi :#include "conio.h"#include "iostream.h"class C_Tableau{ private: Gros Probleme En C [ par Infern0 ] Bon, voila 3 fonction de mon programme. Avec celle d'affichage, quand j'affiche la 1ere, y a aucun probleme, si j'affiche la deuxieme, g des chiffre pb de Z-buffer ac openGL -> Help! [ par Arnaud16022 ] bonjour tt le monde!quelqun pourrait me dire pourqoui le Z-buffer marche pas?pasque le dernier (4ème) triangle dessiné apparait tjs au dessus, meme s' pb de compilation [ par norton ] bonjour, je desir compiler le code suivant mais j'ai une erreur.mon code :#include #include #include void Display();void Reshape(int,int);int main( in


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,515 sec (3)

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