DeePqcK Posté(e) le 21 mai 2010 Partager Posté(e) le 21 mai 2010 Bonjour a tous, Je suis encore et toujours sur mon répertoire électronique et j'avance a petit pas, mais bon j'avance Voici mon code : #include <stdio.h> #include <stdlib.h> #include <string.h> #include "ajouter_un_contact.h" int main() { personne information = {"","","",0,0}; int choixMenu; do // lance une fois la boucle, et la relance tant que la valeur n'est pas = 4 { printf ("Que voulez vous faire?\n\n"); printf ("1. Ajouter un nouveau contact\n\n"); printf ("2. Consulter les donnees des contacts\n\n"); printf ("3. Rechercher un contact\n\n"); printf ("4. Fermer le programme\n\n"); printf ("\nVotre Choix\n"); scanf ("%d" , &choixMenu); printf ("\n"); switch (choixMenu) { case 1: printf ("Vous avez choisi d'ajouter un contact.\n\n"); FILE* fichier = NULL; // Va creer le fichier contenant les contacts. // Je cree le fichier contact.txt, creer le dossier avant !!!!! // a+ pour creer le fichier pourvoir lire/ecrire, ecrire en ajout en partant de la fin ! fichier = fopen("Contact/contact.txt" , "a+"); if (fichier != NULL) // != different de { printf("Quel est votre nom? \n"); gets(information.nom); gets(information.nom); printf("Quel est votre prenom? \n"); gets(information.prenom); printf("Quel est votre numero de voie? \n"); scanf("%d" , &information.voie); printf("Quel est le nom de votre rue, avenue ?\nEx: rue Colbert , Avenue Fosh\n"); gets(information.rue); gets(information.rue); printf("Quel est le nom de votre ville? \n"); gets(information.ville); printf("Quel est votre code postal? Ex: 83470\n"); scanf("%d" , &information.code); printf("Quel est votre sexe\nM = Masculin; F = Feminin \n"); gets(information.sexe); gets(information.sexe); printf("Quel est votre age? \n"); scanf("%d" , &information.age); printf("Quel est votre numero de telephone? \nEx: 0601020304\n"); scanf("%s" , &information.telephone); printf("Quel est votre adresse mail?\nEx : Monadresse@orange.fr \n"); scanf("%s" , &information.mail); // on ecrit dans le fichier contact les informations. fprintf(fichier , "Nom : %s\nPrenom : %s\nAdresse : %d %s\nVille : %s \nCode Postal : %d \nSexe : %s \nAge : %d ans\nTelephone %s\nMail: %s\n\n" , information.nom , information.prenom , information.voie , information.rue , information.ville , information.code , information.sexe , information.age , information.telephone , information.mail); fclose(fichier); // on ferme le fichier test.txt en tous les cas ! C'est une obligation. } printf("Le contact a ete ajoute avec succes\n\n"); break; case 2: printf ("Vous avez choisi de consulter les contacts.\n\n "); fichier = fopen("Contact/contact.txt" , "r+"); system("notepad.exe Contact\\contact.txt"); // permet d'ouvrir le fichier .txt contenant tous les contacts system("pause"); fclose(fichier); break; case 3: printf ("Vous avez choisi de rechercher un contact.\n"); char chaine[200] = {0}; long i = 0, longueurChaine = 0; fgets(chaine, 200, stdin); longueurChaine = strlen(chaine); do { printf("%x\n", chaine[i]); chaine[i] = tolower(chaine[i]); printf("%c\n", chaine[i]); if(chaine[i] == '\n') chaine[i] = 0; else if(chaine[i] == 0xE9 || chaine[i] == 'è' || chaine[i] == 'ê' || chaine[i] == 'ë') chaine[i] = 'e'; else if (chaine[i] == 'à' || chaine[i] == 'â' ||chaine[i] == 'à' || chaine[i] == 'ä') chaine[i] = 'a'; else if (chaine[i] == 'î' || chaine[i] == 'ï') chaine[i] = 'i'; else if (chaine[i] == 'ô' || chaine[i] == 'ö') chaine[i] = 'o'; i++; }while(i <= longueurChaine); printf(" chaine = \"%s\"\n", chaine); system("PAUSE" ); break; case 4: printf ("Au revoir, et merci de votre utilisation"); break; default: printf ("Votre choix est incorrect"); break; } printf ("\n\n"); } while(choixMenu != 4); // Reviens au "do" et ralance la boucle, le programme ce fermera alors si la valeur est = 5 system("pause"); // Empeche la fenêtre DOS de ce fermer return 0; } Voici la structure que j'appel typedef struct personne personne; struct personne { char nom[25]; char prenom[25]; char sexe[7]; unsigned int voie; char rue[60]; char ville[45]; unsigned int code; unsigned int age; // unsigned = strictement positif char telephone[15]; // unsigned int telephone[15]; char mail[45]; }; Voila ou j'en suis. Dans mon menu vous pouvez voir que 4 choix sont possible dont une recherche. Je voudrais via la fonction strlen rechercher un prénom dans le fichier contact.txt et si celui ci existe que cela me retourne bien une réponse positive. Il faudrait réussir a faire saisir a l'utilisateur via un scanf le nom, prenom du contact recherché. Tout le reste fonctionne. Merci d'avance. Lien vers le commentaire Partager sur d’autres sites More sharing options...
uzak Posté(e) le 21 mai 2010 Partager Posté(e) le 21 mai 2010 Bonjour, Premièrement, ce que je voulais te dire l'autre fois, mais je me suis dit que comme tu débutais, t'aurais le temps de voir ça après... Enfin, là ça devient urgent. Il faudrait que tu découpes ton code en sous fonctions. Tu y gagnes en lisibilité, corrections, évolutions... enfin partout quoi. surtout ton switch case. 2/ Tu ne gères pas l'erreur à l'ouverture du fichier : en cas d'erreur, il va afficher "Le contact a été ajouté avec succès". C'est du détail pour le moment. 3/ La comparaison de chaine se fait avec strcmp. Essaie de lire chaque ligne du fichier et de comparer avec la saisie clavier 4/ dans ton case 3, la structure de boucle for(){} est peut-être plus adaptée à un do{}while() Bon courage pour la suite Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 21 mai 2010 Partager Posté(e) le 21 mai 2010 Uzak a raison, avec des fonctions se serait beaucoup plus simple a lire... pour le switch tu pourrait avoir un apple de fonction a chaque "case"... personne information = {"","","",0,0}; ici tu doit bien prendre en compte le fait tu ne dispose que d'une seul structure dans ton code, a chaque fois que l'utilisateur entrera une nouvelle "personne" la precedente qui aura été entrée sera éffacée. ce qui n'a pas vraiement d'importance si tu te contente d'enregistrer les contacts les uns a la suite des autres mais devient plus ennuyeux si tu veut faire un tri ou une recherche... if (fichier != NULL) // != different de { printf("Quel est votre nom? \n"); gets(information.nom); gets(information.nom); les commentaire en générale c'est fait pour expliqué un "bloc" ou a peut près, pas juste un symbole ^^ et a la place du "gets" tu peut utilisé scanf_s(); si tu est sous visual, l'avantage c'est que tu peut controler le nombre de caractère entrés, et que tu aura pas besoin de l'appeler une deuxieme fois a la suite pour vidé ton tampon. => scanf_s("%s", &information.nom, 25); //bordel de struct et pointeur, j'arriverai jamais a m'y faire. // on ecrit dans le fichier contact les informations. fprintf(fichier , "Nom : %s\nPrenom : %s\nAdresse : %d %s\nVille : %s \nCode Postal : %d \nSexe : %s \nAge : %d ans\nTelephone %s\nMail: %s\n\n" , information.nom , information.prenom , information.voie , information.rue , information.ville , information.code , information.sexe , information.age , information.telephone , information.mail); ici, a toi de voir, mais je suis pas convaincu de ta facon d'enregistrer les infos dans le fichier : tu te retrouve avec un "mot" par ligne, j'aurait plutot tendance a enregistrer une structure par ligne, avec un caractère spécial entre chaque struct.elmlt... a toi de voir, en plus sa eviterai d'avoir a ecrire "nom", "prenom", etc... ou d'avoir 1 fichier par contact... printf ("Vous avez choisi de consulter les contacts.\n\n "); fichier = fopen("Contact/contact.txt" , "r+"); system("notepad.exe Contact\\contact.txt"); // permet d'ouvrir le fichier .txt contenant tous les contacts je vois pas trop a quoi sert le fopen ...? mais tu pourrais aussi remplir un tableau de strucutre avec tout tes contact recupéré depuis le fichier et afficher directement dans la console..., et les trier par la meme occasion printf ("Vous avez choisi de rechercher un contact.\n"); char chaine[200] = {0}; long i = 0, longueurChaine = 0; fgets(chaine, 200, stdin); longueurChaine = strlen(chaine); do { printf("%x\n", chaine[i]); chaine[i] = tolower(chaine[i]); printf("%c\n", chaine[i]); if(chaine[i] == '\n') chaine[i] = 0; else if(chaine[i] == 0xE9 || chaine[i] == 'è' || chaine[i] == 'ê' || chaine[i] == 'ë') chaine[i] = 'e'; else if (chaine[i] == 'à' || chaine[i] == 'â' ||chaine[i] == 'à' || chaine[i] == 'ä') chaine[i] = 'a'; else if (chaine[i] == 'î' || chaine[i] == 'ï') chaine[i] = 'i'; else if (chaine[i] == 'ô' || chaine[i] == 'ö') chaine[i] = 'o'; i++; }while(i <= longueurChaine); printf(" chaine = \"%s\"\n", chaine); j'ai du mal a suivre ... tu recupère un chaine de stdin (200 caractère max), tu traite les caractère spéciaux, puis tu réaffiche cette chaine...? en plus normalement, en console t'utilise pas les accent http://www.asciitable.com/, tu peut controlé que tes caractère sont compris entre 65 et 90 pour les majuscule et 97 et 122 pour les minuscule, les lèttres accentués dépassant le 127. ensuite les fonction, isalpha (http://www.cplusplus.com/reference/clibrary/cctype/isalpha/ ) et autres du meme genre peuvent faire le reste. pour ce qui est de ta fonction de recherche, a mon sens, tu devrait surtout te concentré sur la facon dont tu va enregistrer tes elements dans ton fichier, car de là dépendra la facon dont tu va les lire/extraire qui donc INpactera forcement la facon que tu aura de trier/afficher les resultats.... si par exemple tu enregistre 1 element de struct sur chaque ligne ... tu vas avoir beaucoup de "\n" (qui est en plus un caractère un peut spéciale) et sa ne suivra pas la logique de ta structure, si en plus l'utilisateur oublie de remplir 1 champ ou plus, tu va te retrouver avec plusieur "\n" les uns a la suite des autres, et il faudrat que tu geres ces cas la ... par exemple tu pourrait considérer que ta struct est entierement enregistrée sur une ligne, en inserant entre chaque "struct.elmt" un caractère spéciale a la con (un 9 (c'est tab), ou mieux, le 186, celui la ya peut de chance que ton user l'utilise... ) et tu conserve uniquement le "\n" pour indiqué la fin d'une strcut (et donc d'un contact) et le passage a la suivante. ensuite quant tu fait ta fonction de recherche, tu peut ou lire directement dans le fichier et afficher: simple..., ou alors tu peut allouer un tableau de struct = au nombre de contact puis faire un tri, une fois que c'est fait, tu peut faire en sorte que ta fonction de recherche, affiche tout, (et donc remplace ta fonction afficher) ou en affiche seulement une partie (ceux donc le prénom commence par N, par exemple...) [EDIT] sa compile chez toi ce code ??? et, par convention, et meme par necessité, ont declare toujours les variables dans le bloc de 1er niveau de la fonction... c'est plus clair, et sa a l'avantage de compilé... Lien vers le commentaire Partager sur d’autres sites More sharing options...
DeePqcK Posté(e) le 22 mai 2010 Auteur Partager Posté(e) le 22 mai 2010 Bonjour a vous et merci pour ces réponses. Le code compile mais sans le bout de code en case 3, étant donné que j'ai récup ce beau de code pour essayer de le comprendre .. Ensuite, pour ce qui est de découpe en sous fonction je vois pas trop :s Pour l'enregistrement dans le fichier ça ce présente comme ceci, Nom: TonNom Prénom: Alex Adresse: 16 rue patin Etc... Ce que je veux, question de facilité, même si pour une recherche ce sera plus long :s printf ("Vous avez choisi de consulter les contacts.\n\n "); fichier = fopen("Contact/contact.txt" , "r+"); system("notepad.exe Contact\\contact.txt"); // permet d'ouvrir le fichier .txt contenant tous les contacts J'ouvre mon fichier en mémoire, pour le consulter et empêcher sa modification. En tout les cas merci. Je verrais tout ça en rentrant cette aprem, essayer de décortiquer tout ce charabia que vous m'avais écris :français: Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 22 mai 2010 Partager Posté(e) le 22 mai 2010 Nom: TonNomPrénom: Alex Adresse: 16 rue patin Etc... pour en revenir a ce que je disait plus haut ^^ si tu enregistre dans le fichier les chaine "nom:", "prenom:" avant les nom et prenom réel de tes contacts, il faudrat prendre en compte ces chaine de caractère lors de la lecture de ton fichier, ce qui peut complexifier le travail J'ouvre mon fichier en mémoire, pour le consulter et empêcher sa modification. tu ouvre notepad qui lui ouvre ton fichier pour ouvrir ton fichier en memoire, c'est fopen(); qui s'en charge, après, a toi de coder pour recuperer ce qu'il y a dedans. et pour les sous fonction je te prepare un exemple... sa arrive Lien vers le commentaire Partager sur d’autres sites More sharing options...
DeePqcK Posté(e) le 23 mai 2010 Auteur Partager Posté(e) le 23 mai 2010 Merci GROS_FAIGNANT. J'ai essayé comme ceci .. Ca ne marche pas .. Il me retourne une erreur a ma ligne fgets .. fichier = fopen("Contact/contact.txt" , "r+"); do { fgets(line, nombreDeCaracteresLus, fichier); scanf("%s" , &motAChercher); if (strstr(ligne, motAChercher) != NULL) { printf("Oui"); } else { printf("Non"); while (motAChercher == NULL); } Je comprend pas ... De l'aide svp !! Merci d'avance. Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 23 mai 2010 Partager Posté(e) le 23 mai 2010 Merci GROS_FAIGNANT.J'ai essayé comme ceci .. Ca ne marche pas .. Il me retourne une erreur a ma ligne fgets .. fichier = fopen("Contact/contact.txt" , "r+"); do { fgets(line, nombreDeCaracteresLus, fichier); scanf("%s" , &motAChercher); if (strstr(ligne, motAChercher) != NULL) { printf("Oui"); } else { printf("Non"); while (motAChercher == NULL); } Je comprend pas ... De l'aide svp !! Merci d'avance. il manquerait pas un "g" a "line" du fgets ? sinon que t'indique la sortie d'erreur du compilateur ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 23 mai 2010 Partager Posté(e) le 23 mai 2010 euh, c'est quoi NombreDeCaracteresLus ? c'est pas comme ca que s'utilise fgets fgets(buffer, sizeof(buffer), descriptor); et effectivement, line/ligne, pour ton erreur mais, tu aurais pu le comprendre, en regardant l'erreur du compilo. meme si j'admet que sous windows, c'est pas tres clair... Lien vers le commentaire Partager sur d’autres sites More sharing options...
DeePqcK Posté(e) le 23 mai 2010 Auteur Partager Posté(e) le 23 mai 2010 Le g de ligne pour line c'est bien moi qui l'ai retiré. Justement il me retourné une erreur de syntaxe .. alors j'ai modif pour line pensant bien faire mais au final je n'avance pas ... @Mephisto Est ce que si je comprend bien a la place de : fgets(ligne, nombreDeCaracteresLus, fichier); Je dois mettre fgets(buffer, sizeof(buffer), descriptor); ? Merci a vous les gars. Edit: 85 main.c `ligne' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.) 85 main.c `nombreDeCaracteresLus' undeclared (first use in this function) 86 main.c `motAChercher' undeclared (first use in this function) 97 main.c syntax error before "break" Voila les erreurs qu'il me retourne pour lesquels je ne comprend pas ... genre le break . ... Merci a vous Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 23 mai 2010 Partager Posté(e) le 23 mai 2010 Est ce que si je comprend bien a la place de : fgets(ligne, nombreDeCaracteresLus, fichier); Je dois mettre fgets(buffer, sizeof(buffer), descriptor); ? oui et non http://www.cplusplus.com/reference/clibrary/cstdio/fgets/ fgets fonctionne comme sa : (voir la doc en lien^^) char * fgets ( char * str, int num, FILE * stream ); - tout d'abord ta fonction est de type char* - elle recoit en premier parametre char *str, qui est un pointeur sur le tableau (ce qu'on appelle un buffer, tampon en francais, qui est en fait un espace de stockage d'information numerique ... , c'est a dire une suite d'espace de stockage dont les adresse se suive, ... c'est a dire par exemple pour char tab[10] : 10 espace d'1 octet les uns a la suite des autres, long tab[10] : 10 espace de stockage de 4 octect les uns a la suites des autres, etc...) donc dans ce cas c'est un tableau de char que tu doit passé en parrametre, puisque le premier paramettre de la fonction est typé en char. - pour faire cour, le second paramettre correspond a la taille de ton tableau, comme ton tableau est forcement typé en char, si tu passe en premier parrametre char tab[10], alors dans le second tu aura 10, si tu passe en premier paramettre char tab[25] alors dans le second tu devra passer 25 (en gros) - enfin pour le troisieme paramettre, tu lui indique ou lire le flux d'information, se flux peut etre toute source d'information considérée comme un fichier, et en l'occurrence, ton clavier est un flux d'information considéré comme un fichier (et oui ) et référencé par une macro appelée "stdin" donc si ton tableau n'est pas alloué dynamiquement tu aura : fgets(mon_tableau, sizeof(mon_tableau),stdin); si tu veut recupérer dans ton tableau les entrée au clavier... je sais pas si c'est très clair... mais sa a au moin le merite d'etre détaillé... PS: mephisto si t'es toujours par la, ya pas une instruction qui permette de retrouver le nombre de touche frappée au clavier ? 85 main.c `ligne' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.) 85 main.c `nombreDeCaracteresLus' undeclared (first use in this function) 86 main.c `motAChercher' undeclared (first use in this function) 97 main.c syntax error before "break" en tout cas c'est pas du visual studio... tes variable ne sont pas déclarée... et tu a une erreur de syntaxe avant le "break" de la ligne 97 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 23 mai 2010 Partager Posté(e) le 23 mai 2010 Est ce que si je comprend bien a la place de : fgets(ligne, nombreDeCaracteresLus, fichier); Je dois mettre fgets(buffer, sizeof(buffer), descriptor); ? oui et non ok, sur le principe, tu met ce que tu veux en second argumentmais effectivement, une fois que t'as alloue (statique ou dynamique), autant appeller fgets avec la vraie taille de ta variable partant du principe que t'as alloue cette variable intelligemment, pas la peine de compliquer les choses enfin, peu importe et sinon, pour les lectures claviers, justement au sujet des len de ce qui aurait ete tappe (en particulier, pour les touches directionnelles), *LA* fonction a utiliser, c'est read (eventuellement fread) l'avantage avec read : tu peux parametrer la "facon" de lire (ca se fait peut-etre aussi sur un FILE*, je sais pas, ca me semble trop "loin" de l'appel systeme) en gros : #ifndef TIOCSETA # ifdef TCGETA # define TCGETA TIOCGETA # define TCSETA TIOCSETA # else # define TCSETS TIOCSETA # define TCGETS TIOCSETA # endif /* et de memoire, il y en a plusieurs autres, que je ne retrouve pas dans mes includes, peut-etre que je bad-trippe par rapport a hp-ux ou autres archis folklos ou j'ai pu bosser... */ #endif int fd; struct termios old, new; fd = open(fichier, O_RDONLY) ou fd = 0; if (isatty(fd)) { ioctl(0, TIOCGETA, &old); ioctl(0, TIOCGETA, &new); new.c_lflag &= ~(ICANON | ECHO | ISIG); /* * on desactive les flag suivant : * ISIG: prend en compte interrupt, quit, suspend * ICANON: prend en compte kill, erase, werase, rpmt * ECHO: affiche les caracteres */ new.c_cc[VMIN] = 0; new.c_cc[VTIME] = 1; /* * le nombre minimum de caracteres lu a 0 * je sais plus exactement ce qu'est le VTIME, mais le mettre a 1 empeche la bufferisation de ton input */ ioctl(0, TIOCSETA, &new); } et a la fin, tu refais un TIOCSETA de &old (pour etre propre) une fois initialise while ((len = read(fd, buf, BUF_SIZE)) > 0) { buf[len] = 0; [...] } et il faut juste se mefier que, ce genre de set ne fonctionne pas exactement de la meme facon suivant le term pour en revenir a mon exemple des touches directionnelles, la sequences qui correspond a fleche haute (par exemple) est de 27 91 65 (ASCII) de memoire, sous xterm, je recevais buf[0] = 27, puis buf[0] = 91 et buf[0] = 65 par contre, sous gnome-terminal, j'avais buf[0] = 27, buf[1] = 91 et buf[2] = 65 une solution de porc serait un read de 1. techniquement ca marche. c'est juste "deconseille" de submerger ta machine d'appels systemes. une solution plus reflechis consisterait a "bufferiser" des qu'on rencontre un '27' (caractere d'echappement), regarder combien de caracteres on a en buffer, et rediriger sur la fonction correspondante et faire gaffe au 27 qu'arrive tout seul mais je m'egarre... bref, pour voire combien de touches ont ete tapes, il faut passer par read, ou fread, qui renvoient la len lue et de toute facon, a moins d'etre sur un "vrai" fichier, utilise read Lien vers le commentaire Partager sur d’autres sites More sharing options...
DeePqcK Posté(e) le 31 mai 2010 Auteur Partager Posté(e) le 31 mai 2010 Merci a vous. J'ai laissé tomber cette fonction, elle fonctionne a moitié disons .. int main() { int nombreDeCaracteresLus = 100; // on defini la variable pour la fonction recherche char motAChercher[100] = "", ligne[100] = ""; // on defini la variable pour la fonction recherche FILE *fichier = NULL; case 3: fichier = fopen("Contact/contact.txt" , "r+"); printf("Tapez le prenom, nom que vous recherchez\n\n"); scanf("%s" , &motAChercher); printf("\n"); while (fgets(ligne, nombreDeCaracteresLus, fichier) != NULL) { if (strstr(ligne, motAChercher) != NULL) { printf("Oui"); } else { printf("Non"); } } Ca marche ainsi ... Meme si le résultat donne ceci Voila, merci a vous. A + Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 31 mai 2010 Partager Posté(e) le 31 mai 2010 sois tu termines tes printf() avec un "\n", soit tu fais un fflush() ensuite ca a tendance a bufferiser l'inconvenient de s'eloigner du "systeme" au passage, la plus part de tes accolades sont inutiles l'exemple suivant compilerait aussi : while (42) if (0) fonction1(); else fonction2(); comme tu le sens... c'est une philosophie Lien vers le commentaire Partager sur d’autres sites More sharing options...
uzak Posté(e) le 1 juin 2010 Partager Posté(e) le 1 juin 2010 Je suis pour les accolades systématiques. Si t'as une ligne à rajouter dans le bloc, j'ai vu des gens "oublier" de les mettre. Ça arrive bien quand le code est repris par un autre... Mais en effet, c'est une philosophie Lien vers le commentaire Partager sur d’autres sites More sharing options...
GROS_FAIGNAN Posté(e) le 1 juin 2010 Partager Posté(e) le 1 juin 2010 et comme l'ont dit bien d'autre avant moi : les pointeurs !!! http://www.siteduzero.com/tutoriel-3-14005...-pointeurs.html et tu peut aussi voir la suite... en ce qui concerne ton case 3 : case 3: fichier = fopen("Contact/contact.txt" , "r+"); printf("Tapez le prenom, nom que vous recherchez\n\n"); scanf("%s" , &motAChercher); printf("\n"); while (fgets(ligne, nombreDeCaracteresLus, fichier) != NULL) { if (strstr(ligne, motAChercher) != NULL) { printf("Oui"); } else { printf("Non"); } } tu enregistre la "string" recherchée par l'utilisateur, et tu parcours chaque ligne du fichier, pour un maximum de 100 caractère (nombreDeCaracteresLus). et, a chaque fois que la suite de caractères "A-l-e-x-i-s" est présentes dans une de tes ligne tu lui fait afficher "oui", non dans le cas contraire. mais encore une fois, la valeur de ton code depend de la facon dont ont été enregistrer tes informations dans le fichier : si le user a enregistrer : "Alex", comme prenom et "isaac"', comme nom de famille, et que tes infos sont enregistrée les une a la suite des autres, sans "logique", ton code lui ne peut pas deviner... et te renverra "oui" alors que ce n'est presentement pas correcte avec ce que tu cherche. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 1 juin 2010 Partager Posté(e) le 1 juin 2010 en effet => strncmp sur la concaténation du prénom et d'un separateur (ou inversement, suivant comment est organisé ton fichier) t'aura moins de faux positifs Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cherone Posté(e) le 4 juin 2010 Partager Posté(e) le 4 juin 2010 Hum, je suis peut-être HS, mais pour faire des recherches dans un string, strtok est bien pratique pour parser une ligne et faire des recherches dessus après, surtout si on définit bien son format d'enregistrement. Mais c'est peut-être un peu bourrin ici... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 8 juin 2010 Partager Posté(e) le 8 juin 2010 en effet. merci :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.