Probleme d'extraction de fichier - C - Programmation
Marsh Posté le 15-05-2005 à 14:09:02
char sep[15]=".,;:!?\n\t\r\'\"\[]\0"; |
Ca ne sert à rien de mettre un \0 il est rajouté automatiquement sil doit être utilisé comme séparateur ça ne marchera pas. Et indiqué le nombre délément explicitement ([15]) est inutile.
Comme la chaîne est constante pas la peine de créer un tableau pour ça :
const char * const sep=".,;:!?\n\t\r\'\"\[]"; |
scanf ("%s",fichier); |
Ca été dit et redit :
fgets(fichier, sizeof fichier, stdin) ; |
if (tab[i]=='\0') |
Jaurai plutôt dit : jai fini de chercher si le caractère est dans la chaîne.
if (tab[i] == c) |
return i ; serait plus intéressant pour savoir lequel cest enfin cest juste un petit plus.
for(i=0; i<strlen(c); i++) |
Et aller encore un sujet abordé x fois :
for(i=0; c[i]; i++) |
while (!feof(f)) |
Cest pas fini :
while ( (c = fgetc(f)) != EOF ) |
pareil pour la suite :
while ((SearchCara(c, sep, 0)) && (c = fgetc(f)) != EOF ) ; |
while ((!SearchCara(c, sep, 0)) && (motlu[i]=c, (c = fgetc(f)) != EOF) ) ++i; |
convert(motlu); // enleve les majuscules |
Ca serait pas mieux de mettre d'abort la fin de chaîne :
motlu[i]='\0'; |
Et après reste lutilisation abusive des variables globales.
Voilà en vrac ce que jai vu .
Marsh Posté le 15-05-2005 à 15:27:53
lacharlottinne a écrit : Voici mon code source ... |
Bel effort. Le principal problème est qu'il manque ' ' dans la liste des séparateurs. Et aussi, le 0 doit être mis dans le mot extrait avant d'appeler la fonction de mise en minuscule. Il y a aussi des problèmes de sécurité liés à l'utilisation de scanf() et des globales inutiles. Un peu de code mort aussi.. Bref, voici une version plus industrielle de ton code. Pose des questions si tu ne comprends pas :
|
Marsh Posté le 15-05-2005 à 12:33:51
Voici mon code source ...
Je dois réaliser à partir d'un fichier une extraction des mots
C'est à dire que je prends chaque mot du texte et je l'introduit dans un tableau de structure
De plus je dois y faire apparaitre sa frequence
Mon principe est de prendre le texte , de dire tant que tu ne vois pas de séparateur , tu enregistre le mot dans un tableau motlu
Si tu croise un séparateur tu fermes ce tableau
tu enleve les majuscules
et si ce mot n'est pas dans le tableau de structure alors ajoute le et augmente sa frequence
sinon augment sa frequence ..
Malheureusement ca marche pas et je trouve pas pk .. si kk1 pourrai m'aider
si vous voulez passez autre que le forum
=> lacharlottinne@aol.com
=> msn/aim : lacharlottinne
Voici le code source :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define N 1000000
/*
-------------------------------------Declaration--------------------------------
*/
FILE *f=NULL;
int size;
char sep[15]=".,;:!?\n\t\r\'\"\[]\0";
struct mot_frequence
{
char mot[70];
int frequence;
int taille;
};
struct mot_frequence tableau[N];
int nb_mots=0;
/*
----------------------Commande l'ouverture d'un fichier-------------------------
*/
void ouverture ()
{
char fichier[32];
while (f==NULL)
{
printf ("Entrer le chemin du fichier\n" );
scanf ("%s",fichier);
f=fopen(fichier,"r" );
if (f==NULL)
{
printf ("/!\\ Erreur: Probleme d'ouverture en lecture /!\\ \n" );
}
else
{
printf ("Ouverture reussite !! \n " );
printf ("\n" );
}
}
}
/*
---------- Renvoie la position du dernier octets du flot stream-----------------
*/
long filesize(FILE *stream)
{
long curpos,length;
curpos = ftell(stream); // garder la position courante
fseek(stream, 0, SEEK_END); // on place le curseur a la fin
length = ftell(stream); // on prend le nombre de caractères dans la fichier (ie la taille)
fseek (stream, curpos, SEEK_SET); // on remet comme c'était au début
return length; // on retourne la taille du fichier (en octet ie en nombre de char)
}
/*
------------------------Detecte un caratere dans un tableau---------------------
*/
int SearchCara (char c,char tab[],int i)
{
if (tab[i]=='\0')
{
return 0; // à cet endroit tu es à la fin du fichier
}
else
{
if (tab[i] == c)
{
return 1; // à cet endroit tu as trouvé un caractere
}
else
{
return SearchCara (c, tab, i+1); // Sinon continue
}
}
}
/*
----------Converti Majuscule => Minscule + retire la ponctuation----------------
*/
void convert(char c[])
{
int i;
for(i=0; i<strlen(c); i++)
{
c[i]=tolower(c[i]); // passe les caractères en minuscules
}
}
/*
---------------------------------Extraction-------------------------------------
*/
void extraction ()
{
char motlu[70];
char c;
int trouve;
int i=0,k=0;
while (!feof(f))
{
fscanf (f, "%c", &c);
while ((SearchCara(c, sep, 0)) && (!feof(f)) )
{
fscanf(f,"%c", &c) ;
}
i=0 ;
while ((!SearchCara(c, sep, 0)) && (!feof(f))) // Tant que le caractere n'est pas un séparateur
{
motlu[i]=c;
fscanf (f, "%c", &c); // On enregistre le motlu dans un tableau motlu
i++;
}
convert(motlu); // enleve les majuscules
motlu[i]='\0';
k=0;
if (strcmp(motlu,"" )!=0)
{
trouve = 0;
while ( (k < nb_mots) && (trouve==0)) // tant que le que tu n'a pas parcouru tout les mots
{
if ( strcmp(tableau[k].mot, motlu) == 0)
{
tableau[k].frequence++; // Si le mot en question est présent, on augmente la frequence de + 1
trouve=1;
}
k++;
}
if ( trouve == 0)
{
struct mot_frequence aux ;
strcpy (aux.mot, motlu); // Si on a pas trouvé le mot en question, on le place à la fin du tableau
aux.frequence = 1;
tableau[nb_mots] = aux ;
printf ("%s\n", tableau[nb_mots].mot);
tableau[nb_mots].taille=strlen(tableau[nb_mots].mot);
nb_mots++;
}
}
}
}
/*
-------------------------------Programme principale-----------------------------
*/
int i;
int main()
{
ouverture();
extraction(f);
for (i=0; i<nb_mots ; i++) {
printf ("\n" );
printf ("%s:\n\t==========>\tFrequence:%d\t", tableau[i].mot, tableau[i].frequence);
}
system("pause" );
return 0;
}