regarder ce que j('ai fait:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <ctype.h>
//enum booleen {faux, vrai};
struct tabascii{
long cumul;
char code[65];
int carac;
int codifie;
};
struct tabascii ASCII[255];
struct tabascii ASCIIBIS[255];
int dimascii=0;
void miseazero(struct tabascii ASCII[])
{
int i;
for(i=0;i<255;i++){
ASCII[i].cumul=0;
ASCII[i].codifie=0;
ASCII[i].carac=i;
strcpy(ASCII[i].code,"" );
}
}
int calculfrequence(struct tabascii ASCII[], FILE *fic)
{
int c;
int dimascii=-1;//attention car espace!!
fseek(fic,0L,SEEK_SET);
while(!feof(fic)){
c=fgetc(fic);
if(!ASCII[c].cumul){
dimascii=dimascii+1;
ASCII[c].cumul=(ASCII[c].cumul)+1;
}else{
ASCII[c].cumul=(ASCII[c].cumul)+1;
}
}
return dimascii;
}
/*tri de ASCII tri par insertion qui fait en meme temps le classement en ascii*/
void tritable(struct tabascii ASCII[])
{
int j,i ;
struct tabascii v;
for (i = 2; i < 255 ;i++)
{
v = ASCII[i];
j = i;
while ((ASCII[j-1].cumul<v.cumul)&&(j>0))
{
ASCII[j] = ASCII[j-1];
j--;
}
ASCII[j] = v;
}
}
long cumul_freq(struct tabascii ASCII[]){
int i;
long cumulfreq=0;
for(i=0;ASCII[i].cumul!=0;i++){
cumulfreq=cumulfreq+ASCII[i].cumul;
}
return cumulfreq;
}
/*Construction du code*/
void Creation_Codage(struct tabascii ASCII[],int Deb,int Fin, long Tot)
{ printf("deb=%d", Deb);
printf("fin=%d", Fin);
printf("Tot=%d", Tot);
int j;
int k;
long Cumul = 0;
long CumulPrec = 0;
long DemiTot = Tot / 2;
int i = Deb;
int FinS;
int Finc = 1;
do
{
CumulPrec = Cumul;
Cumul = Cumul+ASCII[i].cumul;
if ( (Cumul >= DemiTot) && (i != Deb))
Finc = 0;
i++;
} while((Finc==1)&&(i!= Fin));
if ((i > Deb) && ((Cumul - DemiTot) >(DemiTot - CumulPrec)))
{
i--;
Cumul = CumulPrec;
}
FinS = i-1;
for (j = Deb; j <= FinS; j++)
{
strcat(ASCII[j].code,"0" );
ASCII[j].codifie=1;
}
if (Deb != FinS){
Creation_Codage(ASCII,Deb,FinS,Cumul);
}
for (k = (FinS+1); k <=Fin&&ASCII[k].cumul!=0; k++)
{
strcat(ASCII[k].code, "1" );
ASCII[k].codifie=1;
}
if ((FinS+1) != Fin){
Creation_Codage(ASCII,(FinS+1),Fin,(Tot-Cumul));
}
}
/*transfert vers une autre table*/
/* elle retourne en plus la vraie longueur de ASCII*/
int transfert(struct tabascii ASCII[],struct tabascii ASCIIBIS[]){
int i;
for(i=0;i<255&&ASCII[i].codifie==1;i++){
strcpy(ASCIIBIS[i].code,ASCII[i].code);
ASCIIBIS[i].codifie=ASCII[i].codifie;
ASCIIBIS[i].carac=ASCII[i].carac;
}
return i;
}
/*Ecriture de la table dans le fichier cible*/
void ecrituretable(FILE *fic, struct tabascii ASCIIBIS[]){
int byte=0
int nbbit=0;
int taillebit;
int c;
int i;
while(!feof(fic)){
c=fgetc(fic);
taillebit=strlen(ASCIIBIS[c].code);
for(i=0:i<taillebit;i++){
byte=byte+ASCIIBIS[i].code;
nbbit=nbbit+1;
if (nbbit==8){
byte=0;
nbbit=0;
}
}
}
}
byte = vide
nbbit = 0
tant que pas fin source faire
lire(octet)
Recherche Ind dans Tcodage
tailleBit = nbr de bit de Tcodage(ind).code
pour i = 1 jusqu'à tailleBit faire
byte = byte + Tcodage(ind).code[i]
nbbit = nbbit + 1
si nbbit = 8 alors
ecrire(byte)
byte = vide
nbbit = 0
finsi
fin pour
fin tant que
*/
void main(){
//int i;
int j;
FILE *fic;
char nomfich[40];
printf("Nom du fichier à ouvrir?" );
scanf("%s", nomfich);
if ((fic=fopen(nomfich,"r" ))==NULL){
printf("***************Erreur douverture de fichier**************" );
exit(0);
}
miseazero(ASCII);
int dimascii;
int dimasciibis;
dimascii=calculfrequence(ASCII,fic);
dimasciibis=dimascii-1;
/*for(i=0;i<255;i++){
printf("carac= %d \t",ASCII[i].carac);
printf("cumul=%d\n",ASCII[i].cumul);
}
*/
//printf("carac= %d \t",ASCII[0].cumul);
tritable(ASCII);
long cumulfreq;
cumulfreq=cumul_freq(ASCII);
/*for(j=0;j<255;j++){
printf("carac= %d\t",ASCII[j].carac);
printf("cumul=%d\t",ASCII[j].cumul);
printf("codifie=%d\n",ASCII[j].codifie);
}*/
printf("dimascii=%d\n",dimascii);
printf("cumulfreq=%d\n",cumulfreq);
Creation_Codage(ASCII,0,dimasciibis,cumulfreq);
int lgascii;
lgascii=transfert(ASCII, ASCIIBIS);
for(j=0;j<lgascii;j++){
printf("cumul=%d\t",ASCIIBIS[j].codifie);
printf("code=%s\n",ASCIIBIS[j].code);
printf("carac=%d\n",ASCIIBIS[j].carac);
}
/*for(j=0;j<255;j++){
printf("carac= %d\t",ASCII[j].carac);
printf("cumul=%d\t",ASCII[j].cumul);
printf("code=%s\n",ASCII[j].code);
}*/
}