Probleme d'extraction de fichier

Probleme d'extraction de fichier - C - Programmation

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;
}

Reply

Marsh Posté le 15-05-2005 à 12:33:51   

Reply

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 s’il 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')  
     {  
              return 0; // à cet endroit tu es à la fin du fichier  
     }

J’aurai plutôt dit : j’ai fini de chercher si le caractère est dans la chaîne.
 

       if (tab[i] == c)  
        {  
            return 1; // à cet endroit tu as trouvé un caractere  
        }

return i ; serait plus intéressant pour savoir lequel c’est enfin c’est 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))  
     {  
           fscanf (f, "%c", &c);

C’est 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  
          motlu[i]='\0';

Ca serait pas mieux de mettre d'abort la fin de chaîne :

          motlu[i]='\0';
          convert(motlu); // enleve les majuscules


Et après reste l’utilisation abusive des variables globales.
 
Voilà en vrac ce que j’ai vu :).


Message édité par Tarabiscote le 15-05-2005 à 14:23:01
Reply

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 :


#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;
}


Message édité par Emmanuel Delahaye le 15-05-2005 à 15:30:36

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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