Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/06/2008, à 08:20

Kronen'Bour

Recherche en C

Bonjour à tous,

Je débute en C et en ce moment (depuis un certain temps), je bute sur "comment chercher une chaîne dans un fichier".

Voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main ()
{
FILE* fichier = NULL;
fichier = fopen("mail.txt", "r+");

if (fichier != NULL)
{
#define TAILLE_MAX 100000
char chaine[TAILLE_MAX] = "";
char total[100000]="";
char *trouve;

printf("Concatenation...\n\n");

while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
{
strcat(total, chaine);
}

printf("Recherche..\n\n");

while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
{
trouve = strstr(total,chaine);

if (trouve != NULL)
{
printf("trouve : %s", chaine);
}
break;
}

fclose(fichier);
}
return 0;
}

Le programme ne trouve pas d'occurences alors qu"il y en a belle et bien dans le fichier.
De plus, aucune erreur n'est affichée, à la compilation comme à l'éxécution.

Merci D'avance.

#2 Le 25/06/2008, à 09:11

Benni

Re : Recherche en C

Salut, c'est normal que ça ne marche pas. Le fgets du deuxième while te renvoie NULL car tu as déjà atteint la fin du fichier dans le premier while.

Ensuite j'ai pas bien compris l'intérêt de ton deuxième while... hmm

Un code dans ce style devrait marcher:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAILLE_MAX 100000

int main ()
{
    char   chaine[TAILLE_MAX];
    char   mot[TAILLE_MAX];
    char   total[100000];
    char *trouve;
    FILE *fichier;

    fichier = fopen("mail.txt", "r+");
    if (!fichier)
    {
        perror("fopen");
        return -1;
    }

    printf("Concatenation...\n\n");

    while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
    {
        strcat(total, chaine);
    }

    printf("Rechercher le mot: ");
    scanf("%s", mot);

    if ( strstr(total, mot) )
        printf("trouve : %s\n", mot);
    else
        printf("pas trouve\n");

    fclose(fichier);
    return 0;
}

Voilà smile

Hors ligne

#3 Le 25/06/2008, à 09:13

Karl_le_rouge

Re : Recherche en C

Vérifie le contenu de chaine à la sortie de la première boucle, tu risques d'avoir une surprise.
Indice: quant tu sors, tu fais également un fgets ...

Dernière modification par Karl_le_rouge (Le 25/06/2008, à 09:15)

Hors ligne

#4 Le 25/06/2008, à 09:46

Kronen'Bour

Re : Recherche en C

Merci pour vos réponses smile

Je croyais que ma deuxième boucle allait reprendre le fichier à son début.

@Benni : je souhaite faire une recherche automatisée, mon fichier étant assez lourd smile
La deuxième boucle devait lire une ligne et cherche celle ci dans tout le fichier.
Mais j'ai oublié que la ligne en question serait forcément trouvée smile


Il faudrait que je choisisse à quelle ligne je commence la lecture du fichier, mais je ne sais pas comment faire, sachant que les lignes n'ont pas le même nombre de caractères...

#5 Le 25/06/2008, à 11:33

rniamo

Re : Recherche en C

tu peux parcourir le fichier et compter les '\n' (retour à la ligne), tu fais un truc dans ce style :

nbRetour=0;
while(nbRetour!=nbLIgne)
{
   c=fgetc(); // ou des fgets si tu préfères...
   if (c=='\n')
       nbRetour++;
}

< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#6 Le 25/06/2008, à 17:07

nicolas.sitbon

Re : Recherche en C

tu peux aussi mapper ton fichier en mémoire :

#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#define FILE_NAME "path_to_file"
#define PATTERN "pattern"

int main (void)
{
   int fichier = open (FILE_NAME, O_RDONLY);

   if (fichier != -1)
   {
      struct stat file_size;

      if (fstat (fichier, &file_size) == 0)
      {        
         char const *stream = mmap (NULL, (size_t)file_size.st_size, PROT_READ,
                              MAP_PRIVATE, fichier, 0);

         if (stream != MAP_FAILED)
         {
            char const *match = strstr (stream, PATTERN);

            printf ("%s %s found\n", PATTERN, match != NULL ? "" : "not");
         }
         else
         {
            perror ("mmap");
         }
      }
      else
      {
         perror ("fstat");
      }
   }
   else
   {
      perror ("open");
   }
   
   return 0;
}

Dernière modification par nicolas.sitbon (Le 25/06/2008, à 17:17)

Hors ligne

#7 Le 27/06/2008, à 19:30

Kronen'Bour

Re : Recherche en C

Désolé de mon absence smile


J'ai essayé et réessayer, je n'y arrive pas.
Peut être que je me suis engagé dans une mauvaise voie, il y a peut être un moyen plus simple de chercher les occurences ?


@nicolas.sitbon : je suis encore loin du niveau de ce code ^^

#8 Le 27/06/2008, à 20:15

nicolas.sitbon

Re : Recherche en C

Kronen'Bour a écrit :

@nicolas.sitbon : je suis encore loin du niveau de ce code ^^

et comme ça ?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FILE_NAME  "chemin_vers_fichier"
#define PATTERN    "chaine_à_trouver"

int main (void)
{
   FILE *fichier = fopen (FILE_NAME, "r");

   if (fichier != NULL)
   {
      char buffer[BUFSIZ];
      char *total = NULL;
      size_t total_len = 1;     

      puts ("Concatenation...\n");

      while (fgets (buffer, sizeof buffer, fichier) != NULL)
      {
         size_t buffer_len = strlen (buffer);
         
         char *tmp = realloc (total, total_len + buffer_len);
         
         if (tmp != NULL)
         {
            total = tmp;
            
            if (total_len == 1)
            {
               total[0] = '\0';
            }
            
            strcat (total, buffer);
            total_len += buffer_len;
         }
         else
         {
            perror ("realloc");
            free (total), total = NULL, total_len = 1;
            break;
         }
      }

      if (feof (fichier))
      {
         if (total != NULL)
         {
            char *trouve = strstr (total, PATTERN);

            puts ("Recherche..\n");

            if (trouve != NULL)
            {
               puts (PATTERN " found");
            }
            else
            {
               puts (PATTERN " not found");
            }
         }
      }
      else if (ferror (fichier))
      {
         perror ("fgets");
      }

      free (total), total = NULL;
      fclose (fichier);
   }
   else
   {
      perror ("fopen");
   }
   
   return 0;
}

Dernière modification par nicolas.sitbon (Le 28/06/2008, à 07:44)

Hors ligne