1 | #include <stdio.h> |
---|
2 | #include <string.h> |
---|
3 | #include "dico.h" |
---|
4 | #include "count.h" |
---|
5 | |
---|
6 | |
---|
7 | /********************************************************************* |
---|
8 | Cette fonction retourne successivement tous les mots d'un |
---|
9 | fichier. Un mot est une séquence de caractères qui se termine |
---|
10 | par un espace, une tabulation ou un retour chariot. |
---|
11 | Paramètre : |
---|
12 | infile : pointe sur le fichier déjà ouvert |
---|
13 | Retour : |
---|
14 | La fonction rend un pointeur sur la chaine représentant |
---|
15 | le mot et rend également dans *numero le numéro de ligne |
---|
16 | où se trouve le mot |
---|
17 | *********************************************************************/ |
---|
18 | static char *token(FILE * infile, int *numero) |
---|
19 | { |
---|
20 | static char buffer[1024]; |
---|
21 | static char *current_token = NULL; |
---|
22 | static unsigned numline = 1; |
---|
23 | const char *delim = " \t\n"; |
---|
24 | do |
---|
25 | { |
---|
26 | if (current_token == NULL) |
---|
27 | { |
---|
28 | if (fgets (buffer, sizeof (buffer), infile) == NULL) |
---|
29 | return NULL; |
---|
30 | current_token = strtok (buffer, delim); |
---|
31 | numline++; |
---|
32 | } |
---|
33 | else |
---|
34 | current_token = strtok (NULL, delim); |
---|
35 | } |
---|
36 | while (current_token == NULL); |
---|
37 | *numero = numline; |
---|
38 | return current_token; |
---|
39 | } |
---|
40 | |
---|
41 | /*********************************************************************** |
---|
42 | cette fonction affiche les résultats du comptage |
---|
43 | accumulés dan le dictionnaire root |
---|
44 | ************************************************************************/ |
---|
45 | static void result_count(dico_root_t *root) |
---|
46 | { |
---|
47 | dico_iterator_t *iter = dico_iterator(root); |
---|
48 | dico_item_t *item; |
---|
49 | |
---|
50 | for (item = dico_first(iter) ; item ; item = dico_next(iter)) { |
---|
51 | printf ("%20s : %d occurences\n", item->KEY, item->COUNT); |
---|
52 | } |
---|
53 | } |
---|
54 | |
---|
55 | /************************************************************************ |
---|
56 | La fonction count compte le nombre de mots total d'un fichier |
---|
57 | ainsi que le nombre d'occurences de chaque mots. |
---|
58 | parametre: |
---|
59 | infile : pointe sur le fichier déjà ouvert |
---|
60 | retour: |
---|
61 | La fonction ne renvoie rien. |
---|
62 | Elle affiche le resultat de son comptage |
---|
63 | ************************************************************************/ |
---|
64 | void count (FILE * infile) |
---|
65 | { |
---|
66 | char *tok; |
---|
67 | int numero; |
---|
68 | dico_item_t *item; |
---|
69 | int nb_mots = 0; |
---|
70 | dico_root_t *dico = dico_create(100); |
---|
71 | |
---|
72 | while ((tok = token(infile, &numero))) { |
---|
73 | item = dico_get (dico, tok); |
---|
74 | item->COUNT++; |
---|
75 | nb_mots++; |
---|
76 | } |
---|
77 | |
---|
78 | printf ("le fichier contient %d mots \n\n", nb_mots); |
---|
79 | result_count(dico); |
---|
80 | } |
---|