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

  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
    Retraité
    Inscrit en
    Février 2008
    Messages
    2 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 336
    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 875
    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 875
    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]

  7. #7
    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 Sve@r Voir le message
    Salut

    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.
    salut,
    merci pour votre aide
    je n'ai pas compris comment est ce que je peusx utiliser la fonction fseek ici ??
    merci énormément si vous pouvez m'aider plus

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par le sportif Voir le message
    salut,
    merci pour votre aide
    je n'ai pas compris comment est ce que je peusx utiliser la fonction fseek ici ??
    merci énormément si vous pouvez m'aider plus
    fseek() sert à se déplacer dans le fichier.
    Si par exemple on continue mon idée précédente, la fonction dédiée à la vérif (qui est appelée avant chaque nouvelle insertion) pourrait être sous la forme
    1) je récupère la position actuelle dans le fichier via ftell()
    2) je me place au début du fichier via fseek(fp, 0, SEEK_SET)
    3) je cherche le code cible dans le fichier via boucle lecture + comparaison
    4) si code trouvé je mets un flag à 1 (et éventuellement j'arrête la recherche)
    5) je me replace à la position récupérée en 1 via fseek(fp, pos, SEEK_SET)
    6) je renvoie l'info disant si le code est ou n'est pas dans le fichier

    Au sortir de la fonction, on se retrouve exactement à la même position dans le fichier que celle où on était avant d'y entrer et donc on peut continuer à écrire dans le fichier au bon endroit. Certains pourront même dire que le ftell() initial n'est pas utile vu qu'on est à la fin du fichier à chaque appel (puisque la fonction est appelée avant chaque insertion) mais c'est juste pour rendre la fonction vraiment indépendante de l'appelant (sans présumer de quoi que ce soit, elle remet les choses en l'état)...
    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]

  9. #9
    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 pour la réponse mais je n'ai rien compris je n'ai pas pu résoudre le problème


  10. #10
    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
    Bonsoir tout le monde , j'ai essayé d'écrire ce que mr sev@r m'a demandé
    mais maintenant la saisie s'arrête à 2 et je ne peux pas ajouter plus que 2 produits ??
    qui peut m'aider s'il vous plait ?
    merci beaucoup d'avance

    voilà le code
    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
    #include <stdio.h>
    #include <stdlib.h>
    FILE *produit;
    int CodePdt, Codepdtr, trouve = 0;
    char Couleur[30];
    float PrixUnit;
    int m, nbp, i;
    int verif_code()
    {
        while (trouve == 0) {
    	int m;
    	printf("donner le code n %d à rechercher : ", i);
    	scanf("%d", &Codepdtr);
    	fscanf(produit, "%d", &CodePdt);
    	if (CodePdt != Codepdtr) {
    	    trouve = 1;
    	    fseek(produit, m, SEEK_SET);
    	    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", &PrixUnit);
     
    	    fclose(produit);
     
    	}
    	if (trouve == 0) {
    	    printf("erreur le code existe déjà  ");
    	}
        }
    }
     
     
    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("%d", &CodePdt);
        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", &PrixUnit);
        fprintf(produit, "Code du produit  :%d de couleur :%s ayant pour prix : %fn", CodePdt, Couleur, PrixUnit);
        for (i = 2; i <= nbp; i++) {
    	m = ftell(produit);
    	fseek(produit, 0, SEEK_SET);
    	verif_code();
    	fprintf(produit, "Code du produit :%d de couleur :%s ayant pour prix : %fn", CodePdt, Couleur, PrixUnit);
    	fclose(produit);
        }
        system("PAUSE");
        return 0;
    }

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu te retrouves avec 2 variables appelées m et tu mélanges les deux :
    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
    int m; // la variable globale m 
    int verif_code()
    {
        while (trouve == 0) {
    	int m;  // la variable locale m
    ....
    	    fseek(produit, m, SEEK_SET);  // la variable locale m
    ....
    }
    int main(int argc, char *argv[])
    {
    ...
    	m = ftell(produit);  // la variable globale m
    ...
    }
    La meilleure chose à faire pour commencer est de supprimer le paquet de variables globales, ce sont des pestes, et d'utiliser la possibilité de passer des valeurs en argument de fonctions.

  12. #12
    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
    Bonsoir et merci pour vous tous , bon maintenant je crois que j'ai fait un bon programme où je dois créer un fichier vente contenant des codes clients et des codes produits que je dois vérifier qu'ils appartiennent respectivement aux fichiers client et produit déjà crées ,mais le problème qu'il m'affiche une boucle infinie je ne sais pas où est le problème ??
    merci pour ceux qui puissent m'aider
    voilà le code :
    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
    60
    61
    62
    63
    64
    65
    66
    #include <stdio.h>
    #include <stdlib.h>
    int Codecltn, Codeclt, CodePdt, CodePdtn, nbv, k;
    float Qte;
    int find, trouve;
    char date[30];
    FILE* produit;
    FILE* client;
    FILE* vente;
    void verif_existp() {
        int m, find = 0;
        client = fopen("produit.doc", "r+" );
        printf("donner un code produit n°%d :", k);
        scanf("%d",  &CodePdtn);
        while (find == 0) {
            m = ftell(produit);
            fscanf(produit, "%d", &CodePdt);
            if (CodePdt == CodePdtn) {
                printf("donner la quantité du produit vendu n°:%d", k);
                scanf("%f", & Qte);
                printf("donner la date de la vente n°:%d ", k);
                scanf("%s", date);
                find = 1;
                fseek(produit, m, SEEK_SET);
                scanf("%d",  &CodePdt);
                fprintf(vente, "Cclt:%d  Cpdt:%d  Qpdt:%f   date:%s", Codecltn, CodePdtn, Qte, date);
            }
            else {
                printf("le code client n'existe pas" );
                find = 0;
            }
            fclose(produit);
        }
    }
    void verif_existc() {
        int m, n, trouve = 0;
        client = fopen("client.doc", "r+" );
        printf("donner un code client n°%d :", k);
        scanf("%d", &Codecltn);
        while (trouve == 0) {
            n = ftell(client);
            fscanf(client, "%d",  &Codeclt);
            if (Codeclt == Codecltn) {
                verif_existp();
                trouve = 1;
                fseek(client, n, SEEK_SET);
            }
            else {
                printf("le code client n'existe pas" );
                trouve=0;
            }
            fclose(client);
        }
    }
    int main(int argc, char *argv[]) {
        printf("donner le nombre de ventes:" );
        scanf("%d",  &nbv);
        vente = fopen("vente.doc", "w" );
        for (k = 1; k <= nbv; k++) {
         
            verif_existc();
            fclose(vente);
        }
        system("PAUSE" );
        return 0;
    }

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par le sportif Voir le message
    Bonsoir et merci pour vous tous , bon maintenant je crois que j'ai fait un bon programme où je dois créer un fichier vente contenant des codes clients et des codes produits que je dois vérifier qu'ils appartiennent respectivement aux fichiers client et produit déjà crées ,mais le problème qu'il m'affiche une boucle infinie je ne sais pas où est le problème ??
    merci pour ceux qui puissent m'aider
    voilà le code :
    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
    60
    61
    62
    63
    64
    65
    66
    #include <stdio.h>
    #include <stdlib.h>
    int Codecltn, Codeclt, CodePdt, CodePdtn, nbv, k;
    float Qte;
    int find, trouve;
    char date[30];
    FILE* produit;
    FILE* client;
    FILE* vente;
    void verif_existp() {
        int m, find = 0;
        client = fopen("produit.doc", "r+" );
        printf("donner un code produit n°%d :", k);
        scanf("%d",  &CodePdtn);
        while (find == 0) {
            m = ftell(produit);
            fscanf(produit, "%d", &CodePdt);
            if (CodePdt == CodePdtn) {
                printf("donner la quantité du produit vendu n°:%d", k);
                scanf("%f", & Qte);
                printf("donner la date de la vente n°:%d ", k);
                scanf("%s", date);
                find = 1;
                fseek(produit, m, SEEK_SET);
                scanf("%d",  &CodePdt);
                fprintf(vente, "Cclt:%d  Cpdt:%d  Qpdt:%f   date:%s", Codecltn, CodePdtn, Qte, date);
            }
            else {
                printf("le code client n'existe pas" );
                find = 0;
            }
            fclose(produit);
        }
    }
    void verif_existc() {
        int m, n, trouve = 0;
        client = fopen("client.doc", "r+" );
        printf("donner un code client n°%d :", k);
        scanf("%d", &Codecltn);
        while (trouve == 0) {
            n = ftell(client);
            fscanf(client, "%d",  &Codeclt);
            if (Codeclt == Codecltn) {
                verif_existp();
                trouve = 1;
                fseek(client, n, SEEK_SET);
            }
            else {
                printf("le code client n'existe pas" );
                trouve=0;
            }
            fclose(client);
        }
    }
    int main(int argc, char *argv[]) {
        printf("donner le nombre de ventes:" );
        scanf("%d",  &nbv);
        vente = fopen("vente.doc", "w" );
        for (k = 1; k <= nbv; k++) {
         
            verif_existc();
            fclose(vente);
        }
        system("PAUSE" );
        return 0;
    }
    Pfff tu n'as absolument rien fait de nos conseils. Tu refais 15 fois la même saisie, tu as des globales de partout. Et tu viens en plus nous demander de faire les efforts que toi tu ne fais pas de ton coté.
    Donc tu as une boucle infinie parce que la variable qui sert à sortir de boucle ne prend pas la bonne valeur. T'as qu'à afficher un peu tes variables à certains points clés de ton code pour débugguer ton truc. De plus tu devrais te demander ce qui se passe avec ce fclose() dans la boucle..
    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]

  14. #14
    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
    ahhhhhh oups je suis vraiment désolé j'ai déjà corrigé le code dans ma machine m'ai quand j'ai copié j'ai copié celui qui comporte des fautes le voilà corrigé maintenant (remarque la boucle est infinie malgré que les codes entrés sont dans le fichier client) merci beaucoup si vous pouvez m'aider encore plus (en effet je suis débutant en c c'est pour celà je fais ce genre de fautes )

    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
    60
    61
    62
    63
    64
    65
    #include <stdio.h>
    #include <stdlib.h>
    int Codecltn, Codeclt, CodePdt, CodePdtn, nbv, k;
    float Qte;
    char date[30];
    FILE* produit;
    FILE* client;
    FILE* vente;
    void verif_existp() {
        int m, find = 0;
        client = fopen("produit.doc", "r+" );
        printf("donner un code produit n°%d :", k);
        scanf("%d",  &CodePdtn);
        while (find == 0) {
            m = ftell(produit);
            fscanf(produit, "%d", &CodePdt);
            if (CodePdt == CodePdtn) {
                printf("donner la quantité du produit vendu n°:%d", k);
                scanf("%f", & Qte);
                printf("donner la date de la vente n°:%d ", k);
                scanf("%s", date);
                find = 1;
                fseek(produit, m, SEEK_SET);
                scanf("%d",  &CodePdt);
                fprintf(vente, "Cclt:%d  Cpdt:%d  Qpdt:%f   date:%s", Codecltn, CodePdtn, Qte, date);
            }
            else {
                printf("le code client n'existe pas" );
                find = 0;
            }
           
        } fclose(produit);
    }
    void verif_existc() {
        int m, n, trouve = 0;
        client = fopen("client.doc", "r+" );
        printf("donner un code client n°%d :", k);
        scanf("%d", &Codecltn);
        while (trouve == 0) {
            n = ftell(client);
            fscanf(client, "%d",  &Codeclt);
            if (Codeclt == Codecltn) {
                verif_existp();
                trouve = 1;
                fseek(client, n, SEEK_SET);
            }
            else {
                printf("le code client n'existe pas" );
                trouve=0;
            }
                }fclose(client);
    
    }
    int main(int argc, char *argv[]) {
        printf("donner le nombre de ventes:" );
        scanf("%d",  &nbv);
           for (k = 1; k <= nbv; k++) {
          vente = fopen("vente.doc", "w" );
    
            verif_existc();
            fclose(vente);
        }
        system("PAUSE" );
        return 0;
    }
    [/QUOTE]

  15. #15
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    merci beaucoup si vous pouvez m'aider encore plus (en effet je suis débutant en c c'est pour celà je fais ce genre de fautes )
    Pourquoi tu ne tiens pas compte des conseils qui te sont donnés si tu es débutant ?

    Rien que de voir ces globales (même la variable de boucles k est globale !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int Codecltn, Codeclt, CodePdt, CodePdtn, nbv, k;
    float Qte;
    char date[30];
    FILE* produit;
    FILE* client;
    FILE* vente;
    me fait renoncer à lire plus loin.

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