Recherche d'un mot dans un fichier text en c

[Résolu/Fermé]
Signaler
Messages postés
26
Date d'inscription
samedi 1 janvier 2011
Statut
Membre
Dernière intervention
15 janvier 2011
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
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.
A voir également:

5 réponses

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 785
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,
Messages postés
26
Date d'inscription
samedi 1 janvier 2011
Statut
Membre
Dernière intervention
15 janvier 2011

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
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 785
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.
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,
Messages postés
26
Date d'inscription
samedi 1 janvier 2011
Statut
Membre
Dernière intervention
15 janvier 2011

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é.^^
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 785
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 ;-))).
Messages postés
26
Date d'inscription
samedi 1 janvier 2011
Statut
Membre
Dernière intervention
15 janvier 2011

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
Messages postés
26
Date d'inscription
samedi 1 janvier 2011
Statut
Membre
Dernière intervention
15 janvier 2011

voici un exemple de fichier donnee .txt

Fait
noir blanc rouge jaune
regle
si jaune et rouge alors orange
si noir et blanc alors gris
si blanc et rouge alors rose


et le programme me dit que le mot existe pour le 1ere mot qui est "Fait"
merci bcp
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 785
Je viens de tester ce code et ça marche :
#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,
Messages postés
26
Date d'inscription
samedi 1 janvier 2011
Statut
Membre
Dernière intervention
15 janvier 2011

c le même problème,par exemple si tu veut chercher le mot noir,il ne le trouve pas dans le fichier

merci
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 785
Ah, beh c'est normal.
Le programme actuel compare le mot ("noir") avec toute une ligne. Vu qu'il n'y a pas de ligne "noir", la comparaison échoue.
Il faut employer à la place de strcmp, strstr.
Cdlt,
Messages postés
26
Date d'inscription
samedi 1 janvier 2011
Statut
Membre
Dernière intervention
15 janvier 2011

merciiiii beaucouppp,c'est resoluuuu,merciii infinimennttt.

j ai besoin de votre aide svp jai crée un programme c qui doit chercher un mot dans un fichier texte mais il n a pas marché!
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 785
Merci de créer un nouveau post.