[résolu]Maieuh pourquoi ça marche pas ?

Maieuh pourquoi ça marche pas ? [résolu] - C - Programmation

Marsh Posté le 28-11-2008 à 12:10:30    

Salut à vous,
 
Je voudrais faire un programme de compression de texte. Le principe est le suivant:  
Il y a un tableau de int (occurences[]) et un de char(lettre[]).
 
-Le programme rencontre une lettre[i] dans le fichier texte
-Si la lettre[i] est la même que la lettre[i-1] alors occurences[i-1]++
-Sinon la lettre[i] est nouvelle lettre[i] = caractere lu et occurences[i]++
 
Donc si le texte est "AAAAAAAAAABBBBBB"
apres compression on devrait avoir 10 65 6 66
car il y a 10 caracteres 'A' et 6 caracteres 'B' .
 
Voilà le code :
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void coder (FILE* k);
  4. int main (void)
  5. {
  6.     printf("Execution de la fonction MAIN - OKn";);
  7.     FILE* k = fopen("dessin.txt","r+";);
  8.     if (k != NULL)
  9.         coder(k);
  10.     else
  11.         printf("Impossible d'ouvrir dessin.txtn";);
  12.     printf("Fin de la fonction MAINn";);
  13.     return 0;
  14. }
  15. void coder (FILE* k)
  16. {
  17.     printf("Debut fonction CODERn";);
  18.     int lettre[100000]={0},occurences[100000]={0};
  19.     char l;
  20.     int i=1,nbc=0;
  21.     printf("Initialisation des variables - OKn";);
  22.     FILE* nv = fopen("nv-code.txt","w+";);
  23.     if (nv != NULL)
  24.         printf("Creation nv-code - OKn";);
  25.     while(fscanf(k,"%c",&l))
  26.     {
  27.         printf("Entree dans boucle (while fscanf(k,"%c", &l) - OKn";);
  28.         if(lettre[i]!=lettre[i-1])
  29.         {
  30.             lettre[i]= 'l';
  31.             occurences[i]++;
  32.             i++;
  33.         }
  34.         else
  35.         {
  36.             occurences[i-1]++;
  37.         }
  38.         nbc++;
  39.     }
  40.     printf("Fin de boucle whilen";);
  41.     for(i=0;i<nbc;i++)
  42.     {
  43.         printf("Ecriture des caracteres dans nv-code.txtn";);
  44.         fprintf(nv,"%d %d ",occurences[i+1],lettre[i+1]);
  45.     }
  46.     fclose(nv);
  47.     printf("Fermeture nvn";);
  48. }


J'ai mis des printf un peu partout pour en voir l'avancement et je m'aperçois que je reste bloqué dans la fonction CODER, a l'intérieur de la boucle WHILE.
 
Je ne comprends pas ce qui ne va pas ...


Message édité par cybkiller le 28-11-2008 à 16:42:58
Reply

Marsh Posté le 28-11-2008 à 12:10:30   

Reply

Marsh Posté le 28-11-2008 à 12:14:59    

tu testes pas le retour de ton fscanf...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-11-2008 à 12:37:03    

Salut, et merci pour ta réponse.
 
Le fait de mettre le fscanf en paramètre de while n'équivaut-il pas à un if(fscanf(k,"%c",&l) != NULL) ?

Reply

Marsh Posté le 28-11-2008 à 12:41:47    

Je ne sais pas si c'est lié à ton problème, mais en tout cas fscanf n'est pas vraiment adapté à ce que tu veux faire. Utilises plutôt fgetc().

Reply

Marsh Posté le 28-11-2008 à 12:42:27    

cybkiller a écrit :

Salut, et merci pour ta réponse.
 
Le fait de mettre le fscanf en paramètre de while n'équivaut-il pas à un if(fscanf(k,"%c",&l) != NULL) ?


aux dernières nouvelles, fscanf ne renvoie pas null en fin de fichier.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-11-2008 à 16:06:27    

J'ai modifié le paramètre de la boucle par

 

while(fscanf(k,"%c",&l) != EOF)

 

La boucle se termine mais dans le fichier "nv-code.txt" j'ai que des 0 ...

 

Pour fgetc je sais pas l'utiliser mais ça doit être possible de le faire avec fscanf (je suis en L1 Math-Info et j'ai pas encore vu la fonction fgetc; le prog de cryptage étant un exercice de cour)

 

edit: et j'ai changé la condition du if par if(l !=lettre[i-1])  parce que sinon, ça n'avait pas trop de sens ... maintenant j'ai que des "1 108" dans nv-code.txt ...

Message cité 1 fois
Message édité par cybkiller le 28-11-2008 à 16:12:01
Reply

Marsh Posté le 28-11-2008 à 16:10:54    

cybkiller a écrit :

La boucle se termine mais dans le fichier "nv-code.txt" j'ai que des 0 ...


 
Relis ton code...tu n'utilises jamais ce que tu as lu dans ton fichier...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-11-2008 à 16:12:35    

et pour jouer, il se passe quoi si j'essaie de compresser des idéogrammes chinois selon ton algo ? [:god]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-11-2008 à 16:13:40    

Harkonnen a écrit :

et pour jouer, il se passe quoi si j'essaie de compresser des idéogrammes chinois selon ton algo ? [:god]


fais pas de mauvais esprit, il débute...:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 28-11-2008 à 16:41:24    

Banzaïïïïïïï !!

 

c'est bon, le code fonctionne.
Je le poste pour ceux que ça interesse :

 
Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void decoder (FILE* f);
  4. void coder (FILE* k);
  5. int main (void)
  6. {
  7.     printf("Execution de la fonction MAIN - OKn" );
  8.     FILE* k = fopen("dessin.txt","r+" );
  9.     coder(k);
  10.     FILE* f = fopen("nv-code.txt","r" );
  11.     decoder(f);
  12.     printf("Fin de la fonction MAINn" );
  13.     return 0;
  14. }
  15. void decoder (FILE* f)
  16. {
  17.     char car;
  18.     int i,occ,V;
  19.     double k;
  20.     FILE* d = fopen("dessin.txt","w+" );
  21.     //printf("Vitesse ? (1-100000)" );
  22.     //scanf("%d",&V);
  23.     while(fscanf(f,"%d %d",&occ, &car)==2)
  24.     {
  25.         //fscanf(f,"&d &d",&occ, &car);
  26.         for(i=0;i<occ;i++)
  27.         {
  28.             printf("%c",car);
  29.             fprintf(d,"%c",car);
  30.         }
  31.         k = 0;
  32.         //while(k<V)
  33.             //k++;
  34.     }
  35.     fclose(f);
  36.     fclose(d);
  37. }
  38. void coder (FILE* k)
  39. {
  40.     printf("Debut fonction CODERn" );
  41.     int lettre[100000]={0},occurences[100000]={0};
  42.     char l;
  43.     int i=1,nbc=0;
  44.     printf("Initialisation des variables - OKn" );
  45.     FILE* nv = fopen("nv-code.txt","w+" );
  46.     if (nv != NULL)
  47.         printf("Creation nv-code - OKn" );
  48.     while(fscanf(k,"%c",&l) != EOF)
  49.     {
  50.         //printf("Entree dans boucle (while fscanf(k,"%c", &l) - OKn" );
  51.         //fscanf(k,"%c",&l);
  52.         if(l !=lettre[i-1])
  53.         {
  54.             lettre[i]= l;
  55.             occurences[i]++;
  56.             i++;
  57.         }
  58.         else
  59.         {
  60.             occurences[i-1]++;
  61.         }
  62.     }
  63.     printf("Fin de boucle whilen" );
  64.     for(i=0;lettre[i+1] != 0;i++)
  65.     {
  66.         //printf("Ecriture des caracteres dans nv-code.txtn" );
  67.         fprintf(nv,"%d %d ",occurences[i+1],lettre[i+1]);
  68.     }
  69.     fclose(nv);
  70.     printf("Fermeture nvn" );
  71. }


ps: j'ai écrit une fonction décoder pour être sur que ça marche, pour comparer le texte d'origine avec le texte codé puis décodé.

 

Merci :)

 

edit: je viens de remarquer que les backslash avant les "n" n'étaient pas retranscrits dans le code que je poste dans le forum donc, ce sera à vous de les mettre.


Message édité par cybkiller le 28-11-2008 à 16:42:40
Reply

Marsh Posté le 28-11-2008 à 16:41:24   

Reply

Marsh Posté le 28-11-2008 à 16:53:37    

bien, maintenant tu essaies de compresser un texte chinois [:cupra]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-11-2008 à 17:18:00    

C'est un programme destiné uniquement au marché européen et américain. Il est vendu pour 178€99 TTC seulement (pas) chez votre marchand de journaux...

Reply

Marsh Posté le 28-11-2008 à 18:01:28    

Le problème c'est que dans le cas général, ton algo va en fait augmenter la taille du fichier.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed