Compter les mot d'un fichier text en C

Compter les mot d'un fichier text en C - C++ - Programmation

Marsh Posté le 29-04-2003 à 20:15:45    

Et oui ca parait tout bete et ca l'est mais bon j'ai du mal :)
 
le principe était de refaire ce que fait la commande wc
 
les lignes et les car sans pb mais pour compter les mots il m'en manquait toujours
 
qu'elle est la meilleur solution ?
 
mici  [:volta]


Message édité par EpoK le 29-04-2003 à 20:15:59
Reply

Marsh Posté le 29-04-2003 à 20:15:45   

Reply

Marsh Posté le 29-04-2003 à 20:22:42    

cherche du coté de strtok, ca permet de décomposer une chaine de caractères en fonction d'une liste de délimiteurs que tu lui passe.
 
attention, strtok modifie la chaine qu'on lui passe.
 
exemple de code là :
http://www.cplusplus.com/ref/cstring/strtok.html (1er lien recherche google)
 
Comme délimiteurs, tu mets tout ce qui peut séparer des mots (espace, tab, virgule ...)
 
au lieu d'imprimer les éléments, tu comptes leur nombre et hop !
[edit]fautes de farpe


Message édité par SquiZZ le 29-04-2003 à 20:23:25
Reply

Marsh Posté le 29-04-2003 à 20:26:05    

carrément pas.
 
 
tu lis caractere par caractere si c'est un espace tu es hors d'un mot, quand tu passe d'un espace à autre chose, c'est un mot

Reply

Marsh Posté le 29-04-2003 à 20:32:03    

++Taz a écrit :

carrément pas.
 
 
tu lis caractere par caractere si c'est un espace tu es hors d'un mot, quand tu passe d'un espace à autre chose, c'est un mot
 


 
c'est le principe que j'ai appliqué mais aparement j'ai couillant quand je l'ai passé en C paske ça merde :/

Reply

Marsh Posté le 29-04-2003 à 20:36:42    

il te manque combien de mots par rapport à ce que tu attends ?
 
un par ligne ?

Reply

Marsh Posté le 29-04-2003 à 20:45:44    

SquiZz a écrit :

il te manque combien de mots par rapport à ce que tu attends ?
 
un par ligne ?
 


 
nop j'ai pensé a compter le dernier mot
 
c'est aléatoire défois 3 défois 50
 
proposé vos algo

Reply

Marsh Posté le 29-04-2003 à 21:05:38    

EpoK a écrit :


 
nop j'ai pensé a compter le dernier mot
 
c'est aléatoire défois 3 défois 50
 
proposé vos algo


tu peux aussi poster ton code et un exemple de fichier a traiter en donnant ce que tu attends et ce que tu obtiens.
 
Sinon, en utilisant strtok  :na:  

Code :
  1. #include "stdlib.h"
  2. #include "string.h"
  3. int main(int argc, char* argv[])
  4. {
  5. FILE *fichier;
  6. int nb_lignes, nb_caracteres, nb_mots;
  7. char tampon[128];
  8. if(argc != 2)
  9. {
  10.  printf("erreur nombre arguments\n" );
  11.  return -1;
  12. }
  13. fichier = fopen(argv[1], "r" );
  14. if(!fichier)
  15. {
  16.  printf("erreur ouverture fichier\n" );
  17.  return -2;
  18. }
  19. //init variables
  20. nb_lignes = 0;
  21. nb_caracteres = 0;
  22. nb_mots = 0;
  23. while(fgets(tampon, 128, fichier))
  24. {
  25.  char *token ;
  26.  nb_lignes++;
  27.  nb_caracteres += strlen(tampon);
  28.  token = strtok(tampon, " \t" ); // on prend en compte les tabulations
  29.  while(token)
  30.  {
  31.   nb_mots++;
  32.   token = strtok( NULL, " \t" );
  33.  }
  34. }
  35. fclose(fichier);
  36. printf("lignes : %d     caractères : %d       mots : %d\n", nb_lignes, nb_caracteres, nb_mots);
  37. return 0;
  38. }


 
ca compte les retour chariot comme dans le nombre de caractères

Reply

Marsh Posté le 29-04-2003 à 21:15:52    

Une petite solution qui vaut ce qu'elle vaut :
 

Code :
  1. ....
  2. int inside_word=0;
  3. int nmots=0; 
  4.   while (!feof(mon_fichier))
  5.      {
  6.       C=fgetc(mon_fichier);
  7.           if (isspace(C))
  8.              {
  9.               if (inside_word)
  10.                  {
  11.                   NMOTS++;
  12.                   inside_word=0;
  13.                  }
  14.              }
  15.           else
  16.              inside_word=1;
  17.          }
  18.       }
  19. ....

 
 

Reply

Marsh Posté le 29-04-2003 à 21:19:05    

mauvaise mais tres bien pour le principe du bouleen dans_un_mot
 
 
le feof marche pas, fais une recherche sur le forum

Reply

Marsh Posté le 29-04-2003 à 21:21:46    

ah, flute alors, j'ai sorti ca comme ca sans tester :/ Désolé.

Reply

Marsh Posté le 29-04-2003 à 21:21:46   

Reply

Marsh Posté le 29-04-2003 à 21:31:37    


evadream@skybreaker:~/poub/agenda$ gcc prout.c -Wall -pedantic -o compte
evadream@skybreaker:~/poub/agenda$ ./compte agenda.py
781 mots
evadream@skybreaker:~/poub/agenda$ wc agenda.py
    292     781    7876 agenda.py
evadream@skybreaker:~/poub/agenda$

 
 
Ca à pourtant l'air de fonctionner :/ S'agirait t'il d'une couille à la fflush(stdin) ?  
 

Code :
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.                                                                                                                                    
  4. int main(int argc, char* argv[]){
  5.                                                                                                                                    
  6.         FILE* mon_fichier = fopen(argv[1], "r" );
  7.                                                                                                                                    
  8.         int C;
  9.         int inside_word=0;
  10.         int nmots=0;
  11.                                                                                                                                    
  12.         /* while (!feof(mon_fichier)) */
  13.         while((c=fgetc(fichier)) != EOF) /* suite à la remarque de ++Taz */
  14.         {
  15.                 //C=fgetc(mon_fichier);
  16.                 if (isspace(C))
  17.                 {
  18.                         if (inside_word)
  19.                         {
  20.                                 nmots++;
  21.                                 inside_word=0;
  22.                         }
  23.                 }
  24.                 else
  25.                         inside_word=1;
  26.         }
  27.         fclose(mon_fichier); //edit etourderie (merci ++Taz)
  28.         printf("%d mots\n", nmots);
  29.         return 0;
  30. }


 
Merci pour l'éclaircissement !
 
@+


Message édité par Evadream -jbd- le 29-04-2003 à 21:38:31
Reply

Marsh Posté le 29-04-2003 à 21:35:21    

vire le fclose(stdin);
 
et fais
 
while((c=fgetc(fichier)) != EOF)

Reply

Marsh Posté le 29-04-2003 à 21:39:30    

Correction faite, etourderie. Je réfléchissais à ta remarque c'est pour ca :)  
 
Mais je n'ai toujours pas saisi pour quoi on ne devait pas le faire  ? Il s'agit d'un résultat indeterminé ?
 

Reply

Marsh Posté le 29-04-2003 à 21:43:03    

Reply

Marsh Posté le 29-04-2003 à 21:45:38    

Evadream -jbd- a écrit :

[fixed]
 

Code :
  1. FILE* mon_fichier = fopen(argv[1], "r" );


 


 
ca te dirait pas de tester si l'ouverture du fichier a réussi ?
 
[edit] et le nombre d'arguments lors de l'appel à ton programme ?


Message édité par SquiZZ le 29-04-2003 à 21:46:14
Reply

Marsh Posté le 29-04-2003 à 21:46:08    

++Taz > En effet, merci pour ce topo !
 
@+


Message édité par Evadream -jbd- le 29-04-2003 à 21:49:03
Reply

Marsh Posté le 29-04-2003 à 21:47:52    

SquiZz a écrit :


 
ca te dirait pas de tester si l'ouverture du fichier a réussi ?
 
[edit] et le nombre d'arguments lors de l'appel à ton programme ?


 
J'ai tapé ca en 30 secondes montre en main ( fclose(stdin)...[:acherpy] ), mon but était pas de faire un truc rock stable et de le distribuer à la terre entière pour remplacer wc, mais juste de tester mon raisonnement, sans autre prétention ;)

Reply

Marsh Posté le 29-04-2003 à 21:50:00    

genre...  
 
CHaiCA
 
ps : private joke

Reply

Marsh Posté le 29-04-2003 à 21:51:46    

Mangeur de patates !

Reply

Marsh Posté le 29-04-2003 à 21:53:12    

Epok > tu ne voudrais pas donner ton code, juste pour voir ce qui ne va pas dans ton algo, parce que finalement c'est ca le plus intéressant !

Reply

Sujets relatifs:

Leave a Replay

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