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

fiddy Messages postés 11653 Statut Contributeur 1 847
 
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,
0
elwess20 Messages postés 28 Statut Membre
 
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
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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,
0
elwess20 Messages postés 28 Statut Membre
 
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é.^^
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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 ;-))).
0
elwess20 Messages postés 28 Statut Membre
 
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
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Il ne faut pas mettre fseek.
Et tu n'as pas enlever '\n' dans la chaîne buffer.
0
elwess20 Messages postés 28 Statut Membre
 
pour le buffer,sa marche bien,il m'enleve le \n,
et j'ai enlever le fseek,mais malgré sa,rien m'affiche
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
J'avais pas vu le strchr pour buffer.
Donne-moi un exemple de fichier ainsi qu'un mot que tape l'utilisateur. Et tu dis dans quel cas, le programme dit : "ce mot existe".
Cdlt,
0
elwess20 Messages postés 28 Statut Membre
 
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
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
beatifukfair
 
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é!
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Merci de créer un nouveau post.
0