#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
struct mot_frequence
{
char mot[70];
int frequence;
};
/* nettoyage du flux d'entree */
static int clean (char *buf, FILE * fp)
{
int err = 0;
char *p = strchr (buf, '\n');
if (p != NULL)
{
*p = 0;
}
else
{
int c;
while ((c = fgetc (fp)) != '\n' && c != EOF)
{
}
err = 1;
}
return err;
}
/*
----------------------Commande l'ouverture d'un fichier-------------------------
*/
FILE *ouverture (void)
{
FILE *f = NULL;
while (f == NULL)
{
char fichier[32];
printf ("Entrer le chemin du fichier\n" );
fgets (fichier, sizeof fichier, stdin);
clean (fichier, stdin);
f = fopen (fichier, "r" );
if (f == NULL)
{
printf ("/!\\ Erreur: Probleme d'ouverture en lecture /!\\ \n" );
}
else
{
printf ("Ouverture reussie !! \n " );
printf ("\n" );
}
}
return f;
}
/*
------------------------Detecte un caratere dans une chaine---------------------
*/
static int SearchCara (int c, char const *tab)
{
return strchr (tab, c) != NULL;
}
/*
----------Converti Majuscule => Minscule + retire la ponctuation----------------
*/
static void convert (char *c)
{
size_t const n = strlen (c);
size_t i;
for (i = 0; i < n; i++)
{
/* passe les caracteres en minuscules */
c[i] = tolower (c[i]);
}
}
/*
---------------------------------Extraction-------------------------------------
*/
size_t extraction (FILE * f, struct mot_frequence tableau[], size_t nb_max)
{
size_t nb_mots = 0;
static const char sep[] = " .,;:!?\n\t\r'\"\[]";
int c;
do
{
char motlu[70];
int i = 0;
/* Tant que le caractere est un separateur */
while (SearchCara (c = fgetc (f), sep) && c != EOF)
{
}
if (c == EOF)
{
break;
}
/* Tant que le caractere n'est pas un separateur */
while ((!SearchCara (c, sep)) && c != EOF)
{
/* On enregistre le motlu dans un tableau motlu */
motlu[i] = c;
c = fgetc (f);
i++;
}
motlu[i] = '\0';
convert (motlu); /* enleve les majuscules */
if (strcmp (motlu, "" ) != 0)
{
int k = 0;
int trouve = 0;
/* tant que le que tu n'a pas parcouru tout les mots */
while ((k < nb_mots) && (trouve == 0))
{
if (strcmp (tableau[k].mot, motlu) == 0)
{
/* Si le mot en question est présent, on augmente la frequence de + 1 */
tableau[k].frequence++;
trouve = 1;
}
k++;
}
if (!trouve && nb_mots < nb_max)
{
/* Si on a pas trouve le mot en question,
* on le place a la fin du tableau
*/
struct mot_frequence *p_aux = tableau+nb_mots;
strcpy (p_aux->mot, motlu);
p_aux->frequence = 1;
#if 0
printf ("%s\n", tableau[nb_mots].mot);
#endif
nb_mots++;
}
}
}
while (c != EOF);
return nb_mots;
}
/*
-------------------------------Programme principale-----------------------------
*/
int main (void)
{
FILE *f = ouverture ();
if (f != NULL)
{
#define N 1000
static struct mot_frequence tableau[N];
int nb_mots = extraction (f, tableau, N);
{
int i;
for (i = 0; i < nb_mots; i++)
{
printf ("\n" );
printf ("'%-40s':%d\n", tableau[i].mot, tableau[i].frequence);
}
}
fclose (f), f = NULL;
}
assert (f == NULL);
return 0;
}
|