Pages : 1
#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...
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à
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
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
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
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
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
@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
Pages : 1