IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Programme de recherche dans un fichier txt


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut Programme de recherche dans un fichier txt
    Bonjour je voulais creer un programme qui rechercherai un nom ou un numero de compte dans une base de données (dans un fichier txt préalablement créé)...
    Mais voila lorsque je lance il y'a des avertissements que je ne comprends pas et à un certain niveau il y'a une erreur de segmentation ...je n'ai malheureusement pas encore trouvé le problème d'où cette discussion..... Votre aide sera la bien venue
    Fichiers attachés Fichiers attachés

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 284
    Par défaut
    Sans avoir ni les messages, ni le code, ça va être compliqué de t'aider.

    Les erreurs de segmentation sont souvent liés à un accès mémoire inadéquat, mauvais usage de pointeurs ? Tes warnings t'indiquent peut-être d'ou vient l'erreur justement.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut
    j'ai eu de petit problemes pour joindre le fichier (le code) mais c'est fait tu peux le voir sur la discussion....

    Nom : Capture du 2018-10-22 14-51-11.png
Affichages : 849
Taille : 116,7 Ko
    les messages d'erreur font etat du type de certaines variables qui à mon avis n'a aucun problème vu que ça marche bien dans une autre partie du programme (programme divisé en plusieurs parties)

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Lagane Voir le message
    les messages d'erreur font etat du type de certaines variables qui à mon avis n'a aucun problème vu que ça marche bien dans une autre partie du programme
    Quelle perspicacité. Et donc ? Tu es allé voir en ligne 85 ce qui se passait ? Pourtant t'as tout. T'as le nom de la fonction, la ligne incriminée, la position sur la ligne (54), le numéro de l'argument (le 11°), une coloration syntaxique sur le "%c" associé à "pers.der_op" et même tu peux comparer la syntaxe de cette saisie avec celle de la variable précédente "pers.nouv_sold" pour regarder pourquoi chez-elle tout va bien. Alors que te faut-il de plus ? Ah oui, un cerveau.
    Allez, je t'aide: fscanf(fic,"%s %s %d %d %d %d %d %d %c\n", pers.nom,pers.prenom, &pers.date.jour, &pers.date.mois, &pers.date.annee, &pers.numero, &pers.anc_sold, &pers.nouv_sold, ???pers.der_op).

    Et la prochaine fois, tu postes le code sur le forum au lieu de nous faire aller le chercher.

    PS: ici aussi il y a une erreur
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //fonction ouvrir//
    int ouvrir(FILE **fic){
    	*fic=fopen("data1.txt","a+");
    	printf("\n");
     
    	if (fic != NULL){
    		printf("Creation du fichier réussie\n");
    	}
    	else {
    		printf("Erreur de création du fichier\n");
    		exit(0);
    	}
    	return 0;
    }
    Info: si tu appelles ta fonction de façon normale, alors "fic" ne sera jamais null (autrement dit ce test ne fonctionnera jamais ; ou plutôt il sera toujours vrai ce qui est en fait la même chose).
    Info2: on ne quitte jamais une fonction via exit(). Tu es content que fopen() ne le fasse pas te permettant ainsi de prendre une décision quand le fichier ne s'ouvre pas. Tu es content que malloc() ne le fasse pas te permettant alors là aussi la même chose quand la mémoire n'est pas allouée. Ben comporte-toi de la même façon dans tes fonctions qui, quoi qu'il arrive, doivent se terminer et rendre la main à l'appelant.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 284
    Par défaut
    exit() va quitter l'application immédiatement. Dans l'exemple, tout ce qui a après ouvrir() ne sera donc pas exécuté. Ce n'est pas forcément faux, mais il faut savoir ce que l'on fait. En gros, exit() n'est pas une bonne méthode pour quitter une application sauf dans des cas très précis.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Quelle perspicacité. Et donc ? Tu es allé voir en ligne 85 ce qui se passait ? Pourtant t'as tout. T'as le nom de la fonction, la ligne incriminée, la position sur la ligne (54), le numéro de l'argument (le 11°), une coloration syntaxique sur le "%c" associé à "pers.der_op" et même tu peux comparer la syntaxe de cette saisie avec celle de la variable précédente "pers.nouv_sold" pour regarder pourquoi chez-elle tout va bien. Alors que te faut-il de plus ? Ah oui, un cerveau.
    Allez, je t'aide: fscanf(fic,"%s %s %d %d %d %d %d %d %c\n", pers.nom,pers.prenom, &pers.date.jour, &pers.date.mois, &pers.date.annee, &pers.numero, &pers.anc_sold, &pers.nouv_sold, ???pers.der_op).

    Et la prochaine fois, tu postes le code sur le forum au lieu de nous faire aller le chercher.

    PS: ici aussi il y a une erreur
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //fonction ouvrir//
    int ouvrir(FILE **fic){
    	*fic=fopen("data1.txt","a+");
    	printf("\n");
     
    	if (fic != NULL){
    		printf("Creation du fichier réussie\n");
    	}
    	else {
    		printf("Erreur de création du fichier\n");
    		exit(0);
    	}
    	return 0;
    }
    Info: si tu appelles ta fonction de façon normale, alors "fic" ne sera jamais null (autrement dit ce test ne fonctionnera jamais ; ou plutôt il sera toujours vrai ce qui est en fait la même chose).
    Info2: on ne quitte jamais une fonction via exit(). Tu es content que fopen() ne le fasse pas te permettant ainsi de prendre une décision quand le fichier ne s'ouvre pas. Tu es content que malloc() ne le fasse pas te permettant alors là aussi la même chose quand la mémoire n'est pas allouée. Ben comporte-toi de la même façon dans tes fonctions qui, quoi qu'il arrive, doivent se terminer et rendre la main à l'appelant.
    Merci pour ton aide ...Tu sais on a appris le langage C dans le tas donc certaines notion reste toujours obscures(par exemple le "&" en plus parce que javait pas l’habitude d'utiliser une adresse pour les char je pensais qu'il fonctionnaient comme les int et lors de mes anciens programmes la machine ne le signalait pas comme erreur )...Concernant la partie "fonction ouvrir" c'est la démarche qui nous été apprise par le prof mais je suis ouvert a toute nouvelle manière(qui je me dit sera plus efficace que la mienne)
    J'ai bien suivi tes conseils et il n'y a plus de warning tout semble correcte mais il y a toujours des erreurs dans l 'exécution(par exemple la recherche avec le nom donne les 11 colonne de zéro(sûrement parce qu'il ya 11 arguments) et qui se répète sur plusieurs lignes ....Ça me rend dingue...La deuxième avec le numéro de compte encor pire(erreur de segmentation mais ce n'est plus préoccupant que le 1er problème)...bref tu m'a vraiment fais avancer et je t'en remercie..
    PS: Jai des problème à mon niveau pour envoyer le code directement dans le forum(c'est pour cela que je vous ai envoyé le chercher désolé

    Citation Envoyé par chrtophe Voir le message
    exit() va quitter l'application immédiatement. Dans l'exemple, tout ce qui a après ouvrir() ne sera donc pas exécuté. Ce n'est pas forcément faux, mais il faut savoir ce que l'on fait. En gros, exit() n'est pas une bonne méthode pour quitter une application sauf dans des cas très précis.
    Ah ok je ne le savait pas ..Comme je viens de le signifier c'est la methode qu'on nous a montrer!!
    comment fait on cela selon vous ?

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 284
    Par défaut
    On va présumer que le fichier est proprement structuré.

    Pour commencer, je n'utiliserais pas scanf. Je te laisses lire ceci.

    Je lirais le fichier ligne par ligne avec la fonction fgets dans une boucle while jusqu'à EOF.
    Dans cette chaine, j'utiliserais la fonction strstr() pour trouver l’occurrence du nom recherché.
    Si le nom est trouvé, comme je connais la structure, il ne me reste qu'à lire ce que je veux dans la chaine. Je n'ai même pas besoin d’insérer la struct des enregistrements
    Ce n'est pas la seule façon de faire. Et ce n'est que pour répondre à la demande précise.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lagane Voir le message
    Tu sais on a appris le langage C dans le tas
    Si tu as envie de l'apprendre, alors rien ne t'interdit de télécharger un tutoriel et le lire.

    Citation Envoyé par Lagane Voir le message
    donc certaines notion reste toujours obscures(par exemple le "&" en plus parce que javait pas l’habitude d'utiliser une adresse pour les char je pensais qu'il fonctionnaient comme les int
    un char fonctionne comme un int. D'ailleurs un char n'est rien d'autre qu'un nombre compris entre -128 et 127. Donc en fait, un char peut être vu comme un petit int.
    Et une fonction devant modifier le contenu d'un variable (comme par exemple scanf()) reçoit toujours l'adresse de cette variable donc presque toujours "&var". Seule exception: quand la variable est un tableau (comme une string) car le nom du tableau correspond à l'adresse de son premier élément (autrement dit, pers.nom équivaut à &pers.nom[0] donc quand tu passes "pers.nom" à scanf() c'est déjà une adresse que tu passes).

    Citation Envoyé par Lagane Voir le message
    Concernant la partie "fonction ouvrir" c'est la démarche qui nous été apprise par le prof mais je suis ouvert a toute nouvelle manière(qui je me dit sera plus efficace que la mienne)
    Je n'ai pas dit que la manière était mauvaise (encore que l'utilité d'une telle fonction qui ne fait que rajouter un message à l'action de fopen()...), j'ai dit que tu avais commis une erreur. "fic" c'est une adresse. C'est l'adresse reçue par la fonction. Cette adresse n'est pas modifiée donc si elle n'est pas nulle dès le départ (donc si l'appelant n'a pas passé "null" à cette fonction lors de son appel) elle ne le sera jamais.
    Ce n'est pas "fic" qui est modifié. Tu écris *fic=fopen(...) donc c'est "étoile fic" qui reçoit le retour de fopen(). Donc c'est lui qu'il faut tester.

    Citation Envoyé par Lagane Voir le message
    Jai des problème à mon niveau pour envoyer le code directement dans le forum
    Tu surlignes ton code et tu appuies sur le bouton "#" situé dans le bandeau d'édition. Ou bien tu le mets entre balises . Ou bien tu regardes comment j'ai fait dans mon post précédent.


    Citation Envoyé par Lagane Voir le message
    Ah ok je ne le savait pas ..Comme je viens de le signifier c'est la methode qu'on nous a montrer!!
    comment fait on cela selon vous ?
    On entre dans le programme par le main, on en sort par le main. Toute autre fonction (forcément interne car forcément appelée par le main ou par une autre fonction elle-même appelée par le main) doit impérativement se terminer et rendre la main à son appelant (comme des poupées russes). Si la fonction a un souci et que l'appelant doit en être informé alors elle renvoie une valeur spéciale indiquant "j'ai un souci" (comme par exemple malloc() ou fopen() renvoient NULL quand elles ne peuvent pas allouer ou ouvrir le fichier ; et comme read() renvoie -1 quand il ne peut pas lire). Et l'appelant peut alors gérer le souci. Et s'il ne le peut pas alors il renvoie lui aussi une valeur spéciale à son propre appelant et ainsi de suite jusqu'au main() qui, lui, peut alors quitter par exit() ou alors par return (car main() est aussi une fonction).

    Citation Envoyé par Lagane Voir le message
    tout semble correcte mais il y a toujours des erreurs dans l 'exécution(par exemple la recherche avec le nom donne les 11 colonne de zéro(sûrement parce qu'il ya 11 arguments) et qui se répète sur plusieurs lignes ....Ça me rend dingue...La deuxième avec le numéro de compte encor pire(erreur de segmentation mais ce n'est plus préoccupant que le 1er problème)...
    Ah oui mais là tu tentes de courir sans avoir appris à marcher. Ne plus avoir de warning signifie que la syntaxe est correcte mais si tu ne passes pas les bons éléments aux bonnes fonctions, le programme lui ne produira pas les bons résultats.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. recherche dans deux fichiers txt
    Par silvermanu dans le forum VBScript
    Réponses: 4
    Dernier message: 29/04/2010, 07h57
  2. Ajouter , rechercher dans un fichier txt
    Par Eausport dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/06/2009, 23h31
  3. Réponses: 5
    Dernier message: 01/03/2009, 22h32
  4. Recherche dans un fichier txt
    Par GOMMME dans le forum Langage
    Réponses: 16
    Dernier message: 24/04/2008, 17h15
  5. Recherche dans un fichier .txt et remplacer
    Par FracMaster dans le forum Langage
    Réponses: 12
    Dernier message: 09/05/2007, 09h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo