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 :

fscanf ne récupérant pas la valeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 133
    Par défaut fscanf ne récupérant pas la valeur
    Bonsoir tout le monde,
    le programme consiste à entrer des produits de codes différents dans un fichier alors je dois à chaque fois vérifier que le code n'existe pas et s'il existe j'affiche un message d'erreur ,mais le problème que ma fonction de vérification verif_code() ne fonctionne pas correctement en effet , si je donne le code 1 puis 2 puis 1 le message d'erreur s'affiche et la machine me demande d'entrer un nouveau code alors je mais 2 dans ce cas le message d'erreur ne s'affiche pas une autre fois malgré que le 2 est répété 2 fois ? merci pour ceux qui puissent m'aider
    mon code est le suivant :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <stdio.h>
    #include <stdlib.h>
    FILE *produit;
    long int Codep, Codepr;
    char Couleur[30];
    float prix;
    int nbp, i;
    void verif_code()
    {
        produit = fopen("produit.doc", "r");
        int trouve = 0;
        while ((!(feof(produit))) && (trouve == 0)) {
    	printf("donner le code n %d à rechercher : ", i);
    	scanf("%ld", &Codepr);
    	fscanf(produit, "%ld", Codepr);
    	if (Codep != Codepr) {
    	    printf("donner la couleur du produit numéro %dn", i);
    	    scanf("%s", Couleur);
    	    printf("donner le prix du produit numéro %dn", i);
    	    scanf("%f", &prix);
    	    trouve = 1;
    	} else {
    	    printf("erreur le code existe déjà  ");
    	}
    	fclose(produit);
        }
    }
     
     
    int main(int argc, char *argv[])
    {
        printf("donner le nombre de produits ");
        scanf("%d", &nbp);
        produit = fopen("produit.doc", "w");
        printf("donner le code du produit numéro %dn", 1);
        scanf("%ld", &Codep);
        printf("donner la couleur du produit numéro %dn", 1);
        scanf("%s", Couleur);
        printf("donner le prix du produit numéro %dn", 1);
        scanf("%f", &prix);
        fprintf(produit, "Code du produit  :%ld de couleur :%s ayant pour prix : %fn", Codep, Couleur, prix);
        for (i = 2; i <= nbp; i++) {
    	verif_code();
    	produit = fopen("produit.doc", "a");
    	fprintf(produit, "Code du produit :%ld de couleur :%s ayant pour prix : %fn", Codepr, Couleur, prix);
    	fclose(produit);
        }
     
        system("PAUSE");
        return 0;
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Heuuu...tu arrives à lire ton code indenté comme il est?

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <stdio.h>
    #include <stdlib.h>
    
    FILE * produit;
    long int Codep,Codepr;
    char Couleur[30];
    float prix;
    int nbp,i;
    
    void verif_code()
    {  
      produit=fopen("produit.doc","r");
      int trouve=0;
      while((!(feof(produit)))&&(trouve==0))
        {   printf("donner le code n %d à rechercher : ",i);
          scanf("%ld",&Codepr); 
          fscanf(produit,"%ld", &Codepr);              
          if(Codep != Codepr)
    	{
    	  printf("donner la couleur du produit numéro %d\n",i);
    	  scanf("%s",Couleur);
    	  printf("donner le prix du produit numéro %d\n",i);
    	  scanf("%f",&prix);
    	  trouve=1;
    	}
          else
    	{
    	  printf("erreur le code existe déjà  ") ;
    	}
          fclose(produit);
        }
    }
     
     
    int main(int argc, char *argv[])
    {
      printf("donner le nombre de produits ");
      scanf("%d",&nbp);
      produit=fopen("produit.doc","w");
      printf("donner le code du produit numéro %d\n",1);
      scanf("%ld",&Codep);
      printf("donner la couleur du produit numéro %d\n",1);
      scanf("%s",Couleur);
      printf("donner le prix du produit numéro %d\n",1);
      scanf("%f",&prix);
      fprintf(produit,"Code du produit  :%ld de couleur :%s ayant pour prix : %f\n",Codep,Couleur ,prix);
      for(i=2;i<=nbp;i++)
        {
          verif_code();
          produit=fopen("produit.doc","a");
          fprintf(produit,"Code du produit :%ld de couleur :%s ayant pour prix : %f\n",Codepr,Couleur ,prix);
          fclose(produit);
        }
     
      system("PAUSE");	
      return 0;
    }
    Comme ca c'est déjà un peu plus lisible il me semble.

    Ensuite ligne 17 il te faut passer le pointeur du long int et nom la variable elle-même (en rouge).

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 133
    Par défaut
    merci gerald3d pour la correction est ce que tu peux m'aider à résoudre le problème de la fonction verif_code ? pourquoi elle ne fonctionne pas correctement ?
    merci d'avance pour tout le monde

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Quelques remarques :

    Les ouvertures/fermetures de fichier : il y en a quand même beaucoup, regarde si tu peux pas faire autrement, en tout cas si tu veux conserver ce système tu dois au moins fermer ton fichier avant d'entrer dans la boucle "for(i=2;i<=nbp;i++)" puisque tu vas ré-ouvrir ton fichier dans "verif_code" (regarde dans le fichier résultant le deuxième produit entré ne doit jamais y être)

    La comparaison : pour commencer la variable globale "Codep" n'est modifiée qu'une seule fois (ligne 41), du coup pas étonnant que la comparaison ne fonctionne qu'avec la première valeur.

    La recherche : Tu mets la variable "trouve" à 1 quand "Codep != Codepr" donc justement quand la valeur n'a pas été trouvée

    La lecture des lignes du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(produit,"%ld", &Codepr);
    C'est sûr que c'est mieux avec un "&" mais je ne pense vraiment pas que ça te permette d'extraire correctement et une à une les valeurs de "Code du produit" contenues dans les lignes de ton fichier

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 133
    Par défaut
    Citation Envoyé par pythéas Voir le message

    Les ouvertures/fermetures de fichier : il y en a quand même beaucoup, regarde si tu peux pas faire autrement, en tout cas si tu veux conserver ce système tu dois au moins fermer ton fichier avant d'entrer dans la boucle "for(i=2;i<=nbp;i++)" puisque tu vas ré-ouvrir ton fichier dans "verif_code"
    oui je n'ai pas fais attention, c'est bon j'ai corrigé maintenant
    Citation Envoyé par pythéas Voir le message

    La comparaison : pour commencer la variable globale "Codep" n'est modifiée qu'une seule fois (ligne 41), du coup pas étonnant que la comparaison ne fonctionne qu'avec la première valeur.
    le problème que j'ai essayé de la modifié dans la boucle for alors la machine ne compare que deux code successif càd si je mets 1 puis 1 elle me donne erreur mais si je mets 1,2puis 1 elle n'affiche pas le message d'erreur !??
    Citation Envoyé par pythéas Voir le message
    La recherche : Tu mets la variable "trouve" à 1 quand "Codep != Codepr" donc justement quand la valeur n'a pas été trouvée
    oui merci je l'ai corrigé alors trouve=0;
    Citation Envoyé par pythéas Voir le message
    La lecture des lignes du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(produit,"%ld", &Codepr);
    C'est sûr que c'est mieux avec un "&" mais je ne pense vraiment pas que ça te permette d'extraire correctement et une à une les valeurs de "Code du produit" contenues dans les lignes de ton fichier
    alors que puisse je faire ?
    merci d'avance pour tout aide

    voilà le code après quelques rectifications :


    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <stdlib.h>
    
    FILE * produit;
    long int Codep,Codepr;
    char Couleur[30];
    float prix;
    int nbp,i;
    
    void verif_code()
    {  
      produit=fopen("produit.doc","r");
      int trouve=0;
      while((!(feof(produit)))&&(trouve==0))
        {   printf("donner le code n %d à rechercher : ",i);
          scanf("%ld",&Codepr); 
          fscanf(produit,"%ld", &Codepr);              
          if(Codep != Codepr)
    	{
    	  printf("donner la couleur du produit numéro %d\n",i);
    	  scanf("%s",Couleur);
    	  printf("donner le prix du produit numéro %d\n",i);
    	  scanf("%f",&prix);
    	  trouve=1;
    	}
          else
    	{
    	  printf("erreur le code existe déjà  ") ;
              trouve=0;
    	}
          fclose(produit);
        }
    }
     
     
    int main(int argc, char *argv[])
    {
      printf("donner le nombre de produits ");
      scanf("%d",&nbp);
      produit=fopen("produit.doc","w");
      printf("donner le code du produit numéro %d\n",1);
      scanf("%ld",&Codep);
      printf("donner la couleur du produit numéro %d\n",1);
      scanf("%s",Couleur);
      printf("donner le prix du produit numéro %d\n",1);
      scanf("%f",&prix);
      fprintf(produit,"Code du produit  :%ld de couleur :%s ayant pour prix : %f\n",Codep,Couleur ,prix);
    fclose(produit);
      for(i=2;i<=nbp;i++)
        {
          verif_code();
          produit=fopen("produit.doc","a");
          fprintf(produit,"Code du produit :%ld de couleur :%s ayant pour prix : %f\n",Codepr,Couleur ,prix);
          fclose(produit);
        }
     
      system("PAUSE");	
      return 0;
    }

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    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 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par le sportif Voir le message
    voilà le code après quelques rectifications :


    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <stdio.h>
    #include <stdlib.h>
    
    FILE * produit;
    long int Codep,Codepr;
    char Couleur[30];
    float prix;
    int nbp,i;
    
    void verif_code()
    {  
      produit=fopen("produit.doc","r");
      int trouve=0;
      while((!(feof(produit)))&&(trouve==0))
        {   printf("donner le code n %d à rechercher : ",i);
          scanf("%ld",&Codepr); 
          fscanf(produit,"%ld", &Codepr);              
          if(Codep != Codepr)
    	{
    	  printf("donner la couleur du produit numéro %d\n",i);
    	  scanf("%s",Couleur);
    	  printf("donner le prix du produit numéro %d\n",i);
    	  scanf("%f",&prix);
    	  trouve=1;
    	}
          else
    	{
    	  printf("erreur le code existe déjà  ") ;
              trouve=0;
    	}
          fclose(produit);
        }
    }
     
     
    int main(int argc, char *argv[])
    {
      printf("donner le nombre de produits ");
      scanf("%d",&nbp);
      produit=fopen("produit.doc","w");
      printf("donner le code du produit numéro %d\n",1);
      scanf("%ld",&Codep);
      printf("donner la couleur du produit numéro %d\n",1);
      scanf("%s",Couleur);
      printf("donner le prix du produit numéro %d\n",1);
      scanf("%f",&prix);
      fprintf(produit,"Code du produit  :%ld de couleur :%s ayant pour prix : %f\n",Codep,Couleur ,prix);
    fclose(produit);
      for(i=2;i<=nbp;i++)
        {
          verif_code();
          produit=fopen("produit.doc","a");
          fprintf(produit,"Code du produit :%ld de couleur :%s ayant pour prix : %f\n",Codepr,Couleur ,prix);
          fclose(produit);
        }
     
      system("PAUSE");	
      return 0;
    }
    Salut

    Bon plusieurs remarques
    1) tu fais plein de fopen du même fichier. Tu l'ouvres d'abord en mode "w". Ensuite tu le fermes puis tu l'ouvres dans ta fonction en mode "r" puis ensuite en mode "a". Tu ne peux pas l'ouvrir une seule fois en mode "w+" puis utiliser fseek() pour te déplacer ? Et ta fonction de recherche ben tu lui passes le pointeur fichier pour qu'elle puisse le lire.

    2) tu fais plein de code redondant (comme demander 3 fois de donner la couleur etc etc). Tu ne peux pas redécouper ton code ? Par exemple un algo de ce style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    boucle de saisie de "n" produits
    faire
        boucle infinie
        faire
            saisir code
            si code pas dans fichier (utiliser ici une fonction dédiée à cette vérif) alors sortie de boucle infinie
            afficher code déjà existant
        fin faire
        saisir couleur + reste
        écrire infos dans fichier
    fin faire
    3) on n'utilise pas feof() pour détecter une fin de fichier, cette fonction ne sert pas à ça. On utilise la lecture elle-même (ici fscanf) et on quitte la boucle quand la fonction de lecture échoue. feof sert, une fois que la lecture a échoué, à indiquer si la lecture a échoué à cause de la fin de fichier ou si ça a échoué pour une autre raison (comme une erreur)

    4) stop avec les variables globales. On sent ici le truc mal pensé, préparé à la "va-vite". Si tu réfléchis bien, la seule info utile aux multiples éléments de ce travail c'est le fichier lui-même. Donc tu commences par écrire propre. Tu mets tes variables en local, tu passes le pointeur fichier aux diverses fonctions qui en ont besoin. Bref tu prends le temps de construire une base solide. Tu éviteras ainsi 90% de tes ennuis. Et peut-être même que ça supprimera les pb de ton code (qui est quand-même super confus)..
    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. Query Contains dans Full-Text qui ne retourne pas de valeurs
    Par icebe dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/02/2006, 14h04
  2. erreur '' n'est pas une valeur entière correcte
    Par ffxlenoir dans le forum Langage
    Réponses: 5
    Dernier message: 02/12/2005, 13h57
  3. Réponses: 5
    Dernier message: 12/09/2005, 17h34
  4. [Pb : champ Text = pas de valeur par defaut ?]
    Par mat_dum dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 18/08/2003, 12h57
  5. Réponses: 2
    Dernier message: 22/07/2002, 18h02

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