Recherche d'un mot dans un fichier text en c
Résolu
elwess20
Messages postés
28
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
bonjour a tous,
d'abord je vous souhaite un bonne année.
Ensuite,j'ai besoin de votre aide,j'ai crée un programme en langage c,qui permet d'afficher le contenu de fichier,et de rechercher un mot dans cette fichier et l'extraire,malgré que mon programme ne contient pas d'erreur mais toujours me dit que le mot est introuvable,vraiment j'ai besoin de votre aide et merci.
d'abord je vous souhaite un bonne année.
Ensuite,j'ai besoin de votre aide,j'ai crée un programme en langage c,qui permet d'afficher le contenu de fichier,et de rechercher un mot dans cette fichier et l'extraire,malgré que mon programme ne contient pas d'erreur mais toujours me dit que le mot est introuvable,vraiment j'ai besoin de votre aide et merci.
A voir également:
- Le fichier à télécharger comporte plusieurs calques. l’un d’eux contient un mot caché. quel est ce mot ?
- Trousseau mot de passe iphone - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Mot de passe - Guide
- Fichier bin - Guide
5 réponses
Ton algorithme est faux.
Si tu veux vérifier qu'un mot appartient, il faut comparer entre tab et buffer. Pour cela, il y a la fonction strcmp.
De plus, faut faire attention, lorsque tu utilises gets (qu'il ne faut pas utiliser au passage), il y a un caractère de plus qui est stocké ('\n' : retour chariot), ce qui fera échouer la comparaison.
Pour supprimer le '\n', il faut utiliser la fonction strchr (recherche du caractère) et tu le remplaces par le caractère de terminaison ('\0').
Cdlt,
Si tu veux vérifier qu'un mot appartient, il faut comparer entre tab et buffer. Pour cela, il y a la fonction strcmp.
De plus, faut faire attention, lorsque tu utilises gets (qu'il ne faut pas utiliser au passage), il y a un caractère de plus qui est stocké ('\n' : retour chariot), ce qui fera échouer la comparaison.
Pour supprimer le '\n', il faut utiliser la fonction strchr (recherche du caractère) et tu le remplaces par le caractère de terminaison ('\0').
Cdlt,
merci mon ami pour ton réponse,
j'ai changé la structure d'algorithme comme tu m'a dit ,mais rien affichée
voila la nouveau structure et merci d'avance
et voila ce qu'il m'affiche
test.c: In function 'main':
test.c:10: warning: passing argument 1 of 'strchr' from incompatible pointer type
/usr/include/string.h:235: note: expected 'const char *' but argument is of type 'struct FILE *'
test.c:31: warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast
/usr/include/string.h:143: note: expected 'const char *' but argument is of type 'char'
/tmp/ccMoLVXN.o: In function 'main':
test.c:(.text+0x57): warning: the 'gets' function is dangerous and should not be used.
erreur de segmentation
j'ai changé la structure d'algorithme comme tu m'a dit ,mais rien affichée
voila la nouveau structure et merci d'avance
et voila ce qu'il m'affiche
test.c: In function 'main':
test.c:10: warning: passing argument 1 of 'strchr' from incompatible pointer type
/usr/include/string.h:235: note: expected 'const char *' but argument is of type 'struct FILE *'
test.c:31: warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast
/usr/include/string.h:143: note: expected 'const char *' but argument is of type 'char'
/tmp/ccMoLVXN.o: In function 'main':
test.c:(.text+0x57): warning: the 'gets' function is dangerous and should not be used.
erreur de segmentation
Encore faut-il que ça soit bien utilisé ^^.
Et attention aux erreurs d'inattention : if(strcmp(tab[i],buffer==0)). Tu as mis ==0 dans la fonction...
Et enfin, poste ton code dans des balises "code" (à droite du bouton souligné) sinon c'est illisible.
Voilà un exemple de programme. J'ai pas mis les en-têtes, tu les mettras. Je te conseille de faire une fonction basée sur fgets qui s'occupera d'enlever les '\n' pour que ça soit plus propre et même pourquoi pas vider le buffer clavier, ça serait top ;-)))
En tout cas, tu vois qu'il n'y a pas besoin d'utiliser EOF, etc.
Cdlt,
Et attention aux erreurs d'inattention : if(strcmp(tab[i],buffer==0)). Tu as mis ==0 dans la fonction...
Et enfin, poste ton code dans des balises "code" (à droite du bouton souligné) sinon c'est illisible.
int main(void) {
char tab[BUFSIZE];
char buffer[BUFSIZE];
FILE *fp=fopen("....", "r");
if(fp==NULL) {
fputs(stderr,"erreur à l'ouverture du fichier\n");
return EXIT_FAILURE;
}
printf("votre mot\n");
fgets(tab, sizeof tab, stdin);
{
char *p=strchr(tab, '\n');
if (p!=NULL)
*p=0;
}
while(fgets(buffer, sizeof buffer, fp)) {
/*on enlève le '\n' dans buffer*/
...
if (strcmp(...)==0) {
...
}
}
fclose(fp),fp=NULL:
return 0;
}
Voilà un exemple de programme. J'ai pas mis les en-têtes, tu les mettras. Je te conseille de faire une fonction basée sur fgets qui s'occupera d'enlever les '\n' pour que ça soit plus propre et même pourquoi pas vider le buffer clavier, ça serait top ;-)))
En tout cas, tu vois qu'il n'y a pas besoin d'utiliser EOF, etc.
Cdlt,
merci beaucoup pour ta réponse,
mais le buffer contient que le 1ere ligne de fichier texte,et le programme compare entre le tab et le 1ere ligne seulement ,donc je pense qu'il faut ajouter le EOF,
Encore merci bcp fiddy,tu m'a bien aidé.^^
mais le buffer contient que le 1ere ligne de fichier texte,et le programme compare entre le tab et le 1ere ligne seulement ,donc je pense qu'il faut ajouter le EOF,
Encore merci bcp fiddy,tu m'a bien aidé.^^
Non pas du tout.
while(fgets(buffer, sizeof buffer, fp)) { ... }
Il s'agit d'une boucle while. Cette boucle sera parcourue jusqu'à ce que fgets() renvoie NULL, autrement dit la fin du fichier.
Lors de la première itération, buffer vaudra la première ligne. Lors de la seconde, buffer vaudra la seconde, et ce jusqu'à la fin du fichier.
Néanmoins, ceci suppose que la longueur maximale d'une ligne du fichier soit de BUFSIZE.
Pas besoin de EOF ;-))).
while(fgets(buffer, sizeof buffer, fp)) { ... }
Il s'agit d'une boucle while. Cette boucle sera parcourue jusqu'à ce que fgets() renvoie NULL, autrement dit la fin du fichier.
Lors de la première itération, buffer vaudra la première ligne. Lors de la seconde, buffer vaudra la seconde, et ce jusqu'à la fin du fichier.
Néanmoins, ceci suppose que la longueur maximale d'une ligne du fichier soit de BUFSIZE.
Pas besoin de EOF ;-))).
merci mon ami mais toujours pas de resultat,je pense que j'ai un petit erreu mais je n'arrive pas a le resoudre,j'ai utilisé comme tu m'a dit mais toujours introuvable
mercii
mercii
Je viens de tester ce code et ça marche :
Cdlt,
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void) {
char tab[BUFSIZ];
char buffer[BUFSIZ];
FILE *fp;
fp=fopen("donnees.txt","r");
if(fp==NULL)
{
fputs("erreur à l'ouverture du fichier\n",stderr);
return EXIT_FAILURE;
}
puts("votre mot : ");
fgets(tab, sizeof tab, stdin);
puts(tab);
{
char *p=strchr(tab, '\n');
if (p!=NULL)
*p=0;
}
while(fgets(buffer, sizeof buffer,fp)) {
char *p=strchr(buffer,'\n');
if(p!=NULL)
{
*p='\0';
}
puts(buffer);
if(strcmp(buffer,tab)==0)
{
puts("le mot existe");
}
}
fclose(fp),fp=NULL;
return 0;
}
Cdlt,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question