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 :

Boucle infini pendant lecture dans un fichier


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut Boucle infini pendant lecture dans un fichier
    Bonjour
    alors, voici mon probleme :

    Je dois lire dans un fichier une liste de 4 parametres, nom, prenom, age, et secu.
    le fichier est ecrit comme suit :

    nom1
    prenom1
    age1
    secu1
    nom2
    prenom2
    etc ..


    Afin de pouvoir afficher ces parametres, j'effectue une recherche avec le nom.
    alors voila le code, de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    void visu (char *anu_secu)
     
    {
     
    	FILE *fp;
     
     
     
     
    	printf("Nom desire\t: ");
     
    	scanf("%s",&(tmp.nom));
     
    	fflush;
     
    	puts ("ouverture du fichier en cours..");
     
    	fp=fopen (anu_secu,"r");
     
    	fseek (fp,0,SEEK_SET);
     
    	//RECHERCHE
     
    	while (tmp.nom != st.nom) {
     
     
    		fscanf (fp,"%[^\n]\n",&(st.nom));
     
     
    		getchar();
     
    		fscanf (fp,"%[^\n]\n",&tmp.prenom);
     
    		fscanf (fp,"%[^\n]\n",&tmp.age);
     
    		fscanf (fp,"%[^\n]\n",&tmp.secu);
     
    	}
    }
    Alors, le pointeur vers le fichier (anu_secu) marche bien, il trouve le fichier.
    Les valeurs st.nom, et tmp.nom, font reference a des structures declare en variables generales.

    Donc je fait la voucle tant que le nom rentre au clavier est different de celui inscrit dans le fichier.
    J'ai verifie avec des printfs que les noms etait bien selectionnes, c'est le cas, mais meme, lorsqu'il correspondent, la boucle continue.


    donc je vois pas ou se situe mon probleme.

    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut Re: Boucle infini pendant lecture dans un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",&(tmp.nom));
    Double erreur (pas de limite de buffer -->utiliser fgets() et il faut passer tmp.nom sans en donner l'adresse (enfin je suppose que nom est un tableau de caractères, comment veux-tu qu'on t'aide alors qu'il manque définitions et déclarations... ))

    ce truc ne fait absolument rien... Au passage, fflush(stdin) n'est pas standard, et n'est garenti marcher que sous DOS et Windows

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fp=fopen (anu_secu,"r");
    fseek (fp,0,SEEK_SET);
    Où est la vérification que fp!=NULL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (tmp.nom != st.nom) {
    On ne compare pas deux chaînes ainsi en C... il faut utiliser strcmp()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	fscanf (fp,"%[^\n]\n",&(st.nom));
    	getchar();
    	fscanf (fp,"%[^\n]\n",&tmp.prenom);
    	fscanf (fp,"%[^\n]\n",&tmp.age);
    	fscanf (fp,"%[^\n]\n",&tmp.secu);
    	}
    }
    Mêmes erreurs avec scanf()...

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Boucle infini pendant lecture dans un fichier
    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	fscanf (fp,"%[^\n]\n",&(st.nom));
    	getchar();
    	fscanf (fp,"%[^\n]\n",&tmp.prenom);
    	fscanf (fp,"%[^\n]\n",&tmp.age);
    	fscanf (fp,"%[^\n]\n",&tmp.secu);
    	}
    }
    Mêmes erreurs avec scanf()...
    Et il manque un test de la fin de lecture sur les fonctions de lecture...

    Bref, ce code est une catastrophe...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut Re: Boucle infini pendant lecture dans un fichier
    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",&(tmp.nom));
    Double erreur (pas de limite de buffer -->utiliser fgets() et il faut passer tmp.nom sans en donner l'adresse (enfin je suppose que nom est un tableau de caractères, comment veux-tu qu'on t'aide alors qu'il manque définitions et déclarations... ))
    Desolé, j'ai completement oublie de rajouter la declaration de ma structure. Effectivement nom, est un tableau de charactere.
    Avant d utiliser scanf, j'utilisais gets(tmp.nom) mais au moment de la compilation il me disait qu'il vallait mieux pas l'utiliser (compilation avec gcc4)

    Citation Envoyé par Médinoc
    ce truc ne fait absolument rien... Au passage, fflush(stdin) n'est pas standard, et n'est garenti marcher que sous DOS et Windows
    Au depart j'avais mis flushall, mais comme la libraire conio.h etait introuvable sous linux (autre parametre que j'ai homis d'iniquer), j'ai du cherche quelque chose d'autre, et j'avais trouve ca.
    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fp=fopen (anu_secu,"r");
    fseek (fp,0,SEEK_SET);
    Où est la vérification que fp!=NULL ?
    Il etait dans une autre fonction anterieur dans l'execution a cette boucle.

    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (tmp.nom != st.nom) {
    On ne compare pas deux chaînes ainsi en C... il faut utiliser strcmp()
    Ah, ok, c'est donc pour ca qu'il trouve jamais. merci.

    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	fscanf (fp,"%[^\n]\n",&(st.nom));
    	getchar();
    	fscanf (fp,"%[^\n]\n",&tmp.prenom);
    	fscanf (fp,"%[^\n]\n",&tmp.age);
    	fscanf (fp,"%[^\n]\n",&tmp.secu);
    	}
    }
    Mêmes erreurs avec scanf()...
    ok, je vais essayer avec fgets, mais est ce que fgets pourra lire les entiers?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut Re: Boucle infini pendant lecture dans un fichier
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	fscanf (fp,"%[^\n]\n",&(st.nom));
    	getchar();
    	fscanf (fp,"%[^\n]\n",&tmp.prenom);
    	fscanf (fp,"%[^\n]\n",&tmp.age);
    	fscanf (fp,"%[^\n]\n",&tmp.secu);
    	}
    }
    Mêmes erreurs avec scanf()...
    Et il manque un test de la fin de lecture sur les fonctions de lecture...

    Bref, ce code est une catastrophe...
    Ah, ca, que le code soit une catastrophe, est une chose sure, mais comme je debute, j'espere que tu pardonneras ces erreures nombreuses

    Un test de fin de lecture? Je dois lui dire que lire la ligne jusqu'a rencontrer un caractere de fin de chaine c'est ca?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut Re: Boucle infini pendant lecture dans un fichier
    Citation Envoyé par beware
    Desolé, j'ai completement oublie de rajouter la declaration de ma structure. Effectivement nom, est un tableau de charactere.
    Donc, tmp.nom suffit, &(tmp.nom) est est mauvais.

    Avant d utiliser scanf, j'utilisais gets(tmp.nom) mais au moment de la compilation il me disait qu'il vallait mieux pas l'utiliser (compilation avec gcc4)
    Il ne faut pas utiliser gets() nom plus: utilise fgets().

    Au depart j'avais mis flushall, mais comme la libraire conio.h etait introuvable sous linux (autre parametre que j'ai homis d'iniquer), j'ai du cherche quelque chose d'autre, et j'avais trouve ca.
    Il n'y a rien de standard pour vider le buffer d'entrée d'un terminal (parce qu'il n'y a rien en standard pour vérifier que c'est bien un terminal et non pas un fichier)

    Citation Envoyé par Médinoc
    Où est la vérification que fp!=NULL ?
    Il etait dans une autre fonction anterieur dans l'execution a cette boucle.
    ??? : ???
    Il faut Toujours tester le résultat d'une fonction comme fopen() ou malloc(), même si le dernier appel a marché. Il peut toujours se passer quelque chose.

    ok, je vais essayer avec fgets, mais est ce que fgets pourra lire les entiers?
    Pour l'instant, tu ne lisais pas d'entiers de toute façon, mais des chaînes.
    Le plus facile et le plus sûr, c'est de lire une chaîne avec fgets() et en extraire le nombre avec strtol() ou strtod().

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut Re: Boucle infini pendant lecture dans un fichier
    Citation Envoyé par Médinoc
    Donc, tmp.nom suffit, &(tmp.nom) est est mauvais.
    Ok, je change ca alors.

    Il ne faut pas utiliser gets() nom plus: utilise fgets().
    Je croyais que fgets ne servait que pour lire dans un fichier, or dans le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      printf("Nom desire\t: ");
       scanf("%s",&(tmp.nom));
    il s'agit d acquerir une valeur entree au clavier.

    Il n'y a rien de standard pour vider le buffer d'entrée d'un terminal (parce qu'il n'y a rien en standard pour vérifier que c'est bien un terminal et non pas un fichier)
    Citation Envoyé par Médinoc
    Où est la vérification que fp!=NULL ?
    Il etait dans une autre fonction anterieur dans l'execution a cette boucle.
    ??? : ???
    Il faut Toujours tester le résultat d'une fonction comme fopen() ou malloc(), même si le dernier appel a marché. Il peut toujours se passer quelque chose.
    Ok, merci je savais pas.

    ok, je vais essayer avec fgets, mais est ce que fgets pourra lire les entiers?
    Pour l'instant, tu ne lisais pas d'entiers de toute façon, mais des chaînes.
    Le plus facile et le plus sûr, c'est de lire une chaîne avec fgets() et en extraire le nombre avec strtol() ou strtod().[/quote]

    Ok, merci du tuyau

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Pour la lecture au clavier avec fgets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fgets(buf, sizeof(buf), stdin);
    // si tu veux des nombres
    val = strtol(buf, NULL, 10);

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Trap D
    Pour la lecture au clavier avec fgets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fgets(buf, sizeof(buf), stdin);
    // si tu veux des nombres
    val = strtol(buf, NULL, 10);
    Ok, merci de ton aide

    J'ai encore une ptite question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FILE *fp;
    puts("Informations :");
    puts("==============");
    puts("\n");
     
    printf ("Nom\t\t : ");
    fflush(NULL);
    fgets(st.nom, sizeof(st.nom), stdin);
     
    printf ("Prenom\t\t : ");
    fgets(st.prenom, sizeof(st.prenom), stdin);
    fflush(NULL);
    Quand j'arrive dans cette partie

    la demande de saise du nom est sauté, et j'arrive sur celle du prenom.
    en gros a l'ecran j'ai ca :

    Informations :
    ==============
    Nom : Prenom :
    Ca voudrait dire que je saute la demande du nom, ou qu'il prend un caractere present dans le buffer comme argument du nom?.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beware
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FILE *fp;
    printf ("Nom\t\t : ");
    fflush(NULL);
    Rappel : fflush() n'a d'effet que sur les flux sortants. fflush(NULL) force tous les flux sortants. Tu cherches à faire quoi exactement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    fgets(st.nom, sizeof(st.nom), stdin);
     
    printf ("Prenom\t\t : ");
    fgets(st.prenom, sizeof(st.prenom), stdin);
    fflush(NULL);
    Quand j'arrive dans cette partie

    la demande de saise du nom est sauté, et j'arrive sur celle du prenom.
    en gros a l'ecran j'ai ca :

    Informations :
    ==============
    Nom : Prenom :
    Je dirais que la taille des tableaux de char est insuffisante. Il faut apprendre à bien se servir de fgets() :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    notamment la gestion du '\n'...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Rappel : fflush() n'a d'effet que sur les flux sortants. fflush(NULL) force tous les flux sortants. Tu cherches à faire quoi exactement ?
    Je cherche simplement a vider le buffer, mais on dirait que la syntax exact soir:
    fflush(stdout)

    Citation Envoyé par Emmanuel Delahaye
    Je dirais que la taille des tableaux de char est insuffisante. Il faut apprendre à bien se servir de fgets() :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    notamment la gestion du '\n'...
    Je comprends pas, car les tableaux de caracterest sont de memes tailles (15)

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beware
    Je comprends pas, car les tableaux de caracterest sont de memes tailles (15)
    Certes, mais 14 caractères utiles, est-ce suffisant pour ta saisie, y compris le '\n' ?

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par beware
    Je comprends pas, car les tableaux de caracterest sont de memes tailles (15)
    Certes, mais 14 caractères utiles, est-ce suffisant pour ta saisie, y compris le '\n' ?
    Ben disons, que comme c'est un essai, je ne rentre des noms, que de 5 lettres maximum
    donc j'ai bien la place.

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beware
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par beware
    Je comprends pas, car les tableaux de caracterest sont de memes tailles (15)
    Certes, mais 14 caractères utiles, est-ce suffisant pour ta saisie, y compris le '\n' ?
    Ben disons, que comme c'est un essai, je ne rentre des noms, que de 5 lettres maximum
    donc j'ai bien la place.
    Montre la définition de st. Je sens qu'on a une confusion tableau/pointeur... Avec un sizeof, ça tue...

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    Bonsoir

    voila donc la definition de st :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	struct identity {
     
    		char nom[15];
     
    		char prenom[10];
     
    		int age;
     
    		int secu;
     
    		struct identity *next;
     
    	}st,tmp;

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beware
    voila donc la definition de st :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	struct identity {
    		char nom[15];
    		char prenom[10];
    		int age;
    		int secu;
    		struct identity *next;
    	}st,tmp;
    T'es pas très généreux ... Mais ça devrait fonctionner.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 93
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par beware
    voila donc la definition de st :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	struct identity {
    		char nom[15];
    		char prenom[10];
    		int age;
    		int secu;
    		struct identity *next;
    	}st,tmp;
    T'es pas très génreux ... Mais ça devrait fonctionner.

    Certes c'est pas tres fourni mais c juste un exercice donc,

Discussions similaires

  1. [OS X] [Bash 3] Lecture dans un fichier texte puis boucle
    Par duffman39 dans le forum Shell et commandes POSIX
    Réponses: 8
    Dernier message: 10/07/2014, 10h51
  2. Réponses: 20
    Dernier message: 25/09/2005, 15h07
  3. Lecture dans un fichier
    Par unknown4 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/08/2005, 17h56
  4. [Débutant] Lecture dans un fichier texte
    Par babemagus dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/07/2005, 12h17
  5. Réponses: 12
    Dernier message: 14/06/2004, 13h06

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