Bonjour,
je voulais tester si une valeur existe dans un fichier en langage C je ne sais pas comment faire quelqu'un peut m'aider svp
-----
Bonjour,
je voulais tester si une valeur existe dans un fichier en langage C je ne sais pas comment faire quelqu'un peut m'aider svp
Hello,
l'algo général pour faire ça est
*ouvrir le fichier
* tant qu'on a pas atteint la fin du fichier et pas trouvé la valeur
** lire le fichier
** chercher la valeur
*ferner le fichier
Quels problèmes rencontres-tu ? As-tu des cours de C ? Que contient le fichier ? Quelle genre de valeur cherches-tu (entier, flottant, mots, phrase) ?
je fait ça .
j'ouvre le fichier qui contient des entier une par ligne et je rempli ensuit mon tableau par ces entier la le probleme c'est qu' il faut tjrs caster la ligne en char si nn le tableau seras rempli par des num qui n'existe pas (comme l'adresse du pointeur) et apres je test si les valeur du tableau = une autre val comme çaCode:FILE *file1; file1 = fopen("fichier1.txt", "r"); printf("les chambres reservers\n"); while (car != EOF) { printf("%c", car); b=(char)car; tab[i]=b; car = fgetc(file1); i++; } fclose(file1);
mais il ne fonctionne pas j'ai essaye le strcmp et elle aussi nonCode:for(i=0;i<100;i++){ if(tab[i]==str){ print("fghjkl"); } }
vous pouvez m'aider ??
Dernière modification par gienas ; 13/01/2012 à 18h51. Motif: Ajouté les balise code, obligatoires pour les programmes
Bon plusieurs choses à faire :
1. respirer profondément
2. mettre des balises codes
3. revoir les cours de C
Peux-tu me décrire ce que contient le fichier (quelques lignes du début) et ce que tu cherches dedans (un nombre ?) ? Tu me dis lire des entiers mais ensuite tu essayes d'utiliser strcmp fait pour comparer des string ... c'est un peu confus.
comme je vous ai dit le fichier contient des entier comme ça : 1
2
3
pourquoi je vous ai dit strcmp parce que quand je rempli le tableau sans caster les valeur de fichier récupérer en (char) le tableau stocke des valeur comme 13345544 alors qu'est ce que j'ai fait j'ai casté les valeur en char et le tableau est declarer char *tab[100]; puisque en parle maintenant des chaine de caractère c'est logique aue je met un strcmp pour comparer .vous m'avez compris mnt
Alors si ton fichier contient un entier par ligne, le plus simple est d'utiliser fscanf. Tu peux trouver un exemple intéressant sur http://www.areaprog.com/c/cours-259-...8e04eb0ec4d4c1 et de la doc sur fscanf sur http://www.siteduzero.com/tutoriel-3...html#ss_part_2.
Ensuite pas le peine de stocker tout le fichier dans un tableau, il suffit de lire une entier, s'il s'agit de la valeur cherchée : c'est fini tu l'as trouvée, si tu arrives en fichier de fichier sans trouver la valeur c'est qu'elle n'est pas dans le fichier.
Comme tu m'as l'air bien perdu, nous allons essayer de le faire pas à pas ...
Je te propose d'abord de mettre dans une variable filename le nom du fichier, cette variable aura donc pour type char*. Une autre variable va contenir la valeur que tu chercheras dans le fichier, je la nomme valeur, elle sera donc de type int. Comme on doit accéder au contenu d'un fichier nous allons aussi avoir besoin d'une variable de type FILE* que nous nommerons file.
une début de code pourra être :
Pour ouvrir un fichier et l'utiliser via une variable de type FILE* il faut utiliser fopen. La doc de fopen nous dit qu'il faut passer deux paramètre, le nom du fichier de type char* et un mode d'ouverture de type char* aussi. Cette fonction renvoie soit la valeur NULL (dans ce cas le fichier n'a pas pu être ouvert) ou une autre valeur (dans ce cas le fichier a pu être ouvert et est utilisable). Nous allons gérer simplement l'erreur en ouverture :Code:#include <stdio.h> int main() { char* filename="chemin et nom du fichier"; int valeur=12; /* par exemple */ FILE* file; }
Maintenant nous allons remplacer les ... par le code qui cherche une valeur dans le fichier.Code:#include <stdio.h> int main() { char* filename="chemin et nom du fichier"; int valeur=12; /* par exemple */ FILE* file; file=fopen(filename,"r"); /* nous ne faisons que lire le fichier */ if (file==NULL) { /* une erreur est survenue */ printf("Le fichier %s n'a pas pu être ouvert\n",filename); } else { /* le fichier est ouvert : on peut y aller */ ... } }
Nous allons utiliser une variable qui indiquera si nous avons trouvé la valeur ou pas. Nommons la found, elle sera de type int, elle vaudra 0 par défaut et si nous trouvons la valeur alors nous la positionnerons à 1. Il nous faudra aussi une variable entière qui contiendra la valeur lue dans le fichier, nommons la valeurLue.
L'algorithme que nous utiliserons sera classique :
ce qui peut se traduire en :Code:tant que (found==0) et (non fin de fichier) lire valeurLue dans fichier si valeurLue==valeur alors found=1 fin si fin tant que
En regardant la doc de fscanf/scanf de plus près on apprend que ces fontions renvoient une valeur qui est le nombre de variables lues avec succès. En gros si fscanf renvoie une valeur différente de 1, valeurLue ne contiendra pas une valeur correcte. Ajoutons un test pour ça :Code:#include <stdio.h> int main() { char* filename="chemin et nom du fichier"; int valeur=12; /* par exemple */ int valeurLue; int found; FILE* file; file=fopen(filename,"r"); /* nous ne faisons que lire le fichier */ if (file==NULL) { /* une erreur est survenue */ printf("Le fichier %s n'a pas pu être ouvert\n",filename); } else { /* le fichier est ouvert : on peut y aller */ found=0; while ( (found==0) && (!feof(file)) ) { fscanf(file,"%d",&valeurLue); if (valeurLue==valeur) found=1; } } }
Je teste la valeur de retour de fscanf directement sans la stocker dans une variable intermédiaire.Code:#include <stdio.h> int main() { char* filename="chemin et nom du fichier"; int valeur=12; /* par exemple */ int valeurLue; int found; FILE* file; file=fopen(filename,"r"); /* nous ne faisons que lire le fichier */ if (file==NULL) { /* une erreur est survenue */ printf("Le fichier %s n'a pas pu être ouvert\n",filename); } else { /* le fichier est ouvert : on peut y aller */ found=0; while ( (found==0) && (!feof(file)) ) { if (fscanf(file,"%d",&valeurLue)==1) if (valeurLue==valeur) found=1; } } }
Il ne reste plus qu'à terminer en fermant le fichier et en affichant le résultat :
Encore une toute dernière chose : main est une fonction qui renvoie un int. Par convention il renvoie 0 si tout est OK, une autre valeur pour signaler une erreur (ou autre chose, un état, un résultat, ...). Pour cet exemple nous allons simplement renvoyer 0 si la valeur n'a pas été trouvée, 1 si elle a été trouvée et -1 s'il y a eu une erreur.Code:#include <stdio.h> int main() { char* filename="chemin et nom du fichier"; int valeur=12; /* par exemple */ int valeurLue; int found; FILE* file; file=fopen(filename,"r"); /* nous ne faisons que lire le fichier */ if (file==NULL) { /* une erreur est survenue */ printf("Le fichier %s n'a pas pu être ouvert\n",filename); } else { /* le fichier est ouvert : on peut y aller */ found=0; while ( (found==0) && (!feof(file)) ) { if (fscanf(file,"%d",&valeurLue)==1) if (valeurLue==valeur) found=1; } fclose(file); if (found==1) printf("La valeur %d a été trouvée dans le fichier '%s'\n", valeur, filename); else printf("La valeur %d n'a pas été trouvée dans le fichier '%s'\n", valeur, filename); } }
Je t'encourage évidemment à consulter la doc, surtout celle qui traite de scanf/fscanf, comment traiter un fichie et surtout faire des tutos aussi bien sur C que sur les algos basiques.Code:#include <stdio.h> int main() { char* filename="chemin et nom du fichier"; int valeur=12; /* par exemple */ int valeurLue; int found; int resultat; FILE* file; file=fopen(filename,"r"); /* nous ne faisons que lire le fichier */ if (file==NULL) { /* une erreur est survenue */ printf("Le fichier %s n'a pas pu être ouvert\n",filename); resultat=-1; } else { /* le fichier est ouvert : on peut y aller */ found=0; while ( (found==0) && (!feof(file)) ) { if (fscanf(file,"%d",&valeurLue)==1) if (valeurLue==valeur) found=1; } fclose(file); if (found==1) { printf("La valeur %d a été trouvée dans le fichier '%s'\n", valeur, filename); resultat=1; } else { printf("La valeur %d n'a pas été trouvée dans le fichier '%s'\n", valeur, filename); resultat=0; } } return resultat; }
Merci infiniment ça a marche