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 :

Problème de fwrite


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Problème de fwrite
    Bonjour à tous, j'ai besoin de votre aide car j'ai un soucis dans le code suivant :


    Voici la structure que j'utilise,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct film 
        { char titre[100],acteurs[100],genre[100];
        int places,duree;
          short supp;
        };


    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
     
    void tarif ()
    {
     
        struct film a;
        char title[100],rep;
        int pla,prix,z;
        int code,x,i=0;
        FILE *f;
     
      printf ("\n                                                                                     Bienvenue dans la consultation des tarifs de CineMaverick ! ");
      printf ("\n\n                                                                                     Pour quel film voulez vous reserver vos places ?");
      scanf(" %s",title);
      fflush(stdin);
        f=fopen("d:/projetc/film.dat","rw");
      if(f)
      { x=fread(&a,sizeof(a),1,f);
        while(!feof(f))
        { if(a.supp==0)
     
          {if(strcmpi(a.titre,title)==0)
            { 
     
               printf("\n TITRE : %s \n\nACTEURS : %s \n\n GENRE : %s \n\nDUREE : %d min \n\nPLACES DISPOS : %d \n\n",a.titre,a.acteurs,a.genre,a.duree,a.places);
     
               printf("\n                                                                                      %d   places restantes",a.places);
               printf("\n                                                                                     est-ce le bon film(o/n) ? ");
              scanf(" %c",&rep);
               if(rep=='o'||rep=='O')
               {
                printf("\n\n                                                                                     Une place coute 10 euros,combien en voulez vous ?");
                scanf("%d",&pla);
                fflush(stdin);
                a.places= a.places-pla;
     
                if (a.places<0)
                     printf("\n                                                                                     Il n'y a plus assez de places restantes");
               else
                {
                    if(a.places>0)
                 {
               prix=pla*10;
               printf("\n                                                                                     Il y a : %d , places restantes",a.places);
               printf("\n                                                                                     Vous devez payer : %d",prix);
     
                 }
                }
               }
               else
            fread(&a,sizeof(a),1,f);
            }
             else
           printf("\n                                                                                     erreur, ce film n'existe pas!");
                }
              x=fread(&a,sizeof(a),1,f);
     
     
        }
     
        fclose(f);
      }
      else
        printf("\n                                                                                     erreur, le fichier n'existe pas ");
    }

    Donc en gros je voudrais que quand l'utilisateur entre le nombre de places qu'il désire, le nombre de places dispo dans le fichier ( a.places) se décremente aussi dans le fichier.

    Car dans mon code ci-dessus, il se décremente uniquement a l'ecran et puis un fois que je réaffiche ce qu'il y a dans le fichier, c'est toujours le nombre de places initial qui s'affiche.

    Quelqu'un peut il me dire comment remédier à ca ?

    Merci d'avance et bonne journée.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    C'est normal que ton fichier ne soit pas modifié. Ta structure en mémoire n'a pas de lien automatique avec ton fichier.
    Il te faut retourner dans le fichier au même emplacement et écrire par dessus tes valeurs précédentes. Regarde du côté des fonctions fseek et ftell, elles sont utilisées pour se déplacer dan un fichier. Tu peux alors soit te repositionner au début de la structure dans le fichier et la réécrire entièrement avec un fwrite soit aller directement à la position de ton nombre de place et le réécrire.

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Tu pourrais aussi stocker toutes tes valeurs dans tes variables et ne les ecrire dans le fichier que lorsque tu les aurais toutes en ecrasant celui existant si besoin.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    En suivant vos conseils j'ai fais ce 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
    67
    68
     
    void tarif ()
    {
     
        struct film a;
        char title[100],rep;
        int pla,prix,z,flag=0;
        int code,i=0;
        FILE *f;
     
      printf ("\n                                                                                     Bienvenue dans la consultation des tarifs de CineMaverick ! ");
      printf ("\n\n                                                                                     Pour quel film voulez vous reserver vos places ?");
      scanf(" %s",title);
      fflush(stdin);
        f=fopen("d:/projetc/film.dat","rw");
      if(f)
      { fread(&a,sizeof(a),1,f);
        while(!feof(f) && flag==0)
        { if(a.supp==0)
     
          {if(strcmpi(a.titre,title)==0)
            { 
     
    		   printf("\n                                                                                     TITRE : %s \n\n                                                                                     ACTEURS : %s \n\n                                                                                     GENRE : %s \n\n                                                                                     DUREE : %d min \n\n                                                                                     PLACES DISPOS : %d \n\n                                                                                     ----------------------------------------- ",a.titre,a.acteurs,a.genre,a.duree,a.places);
               printf("\n                                                                                      %d   places restantes",a.places);
               printf("\n                                                                                     est-ce le bon film(o/n) ? ");
              scanf(" %c",&rep);
               if(rep=='o'||rep=='O')
               {
                printf("\n\n                                                                                     Une place coute 10 euros,combien en voulez vous ?");
                scanf("%d",&pla);
                fflush(stdin);
                a.places= a.places-pla;
     
                if (a.places<0)
            	     printf("\n                                                                                     Il n'y a plus assez de places restantes");
               else
    		    {
    		   	 if(a.places>0)
                 {
               prix=pla*10;
               printf("\n                                                                                     Il y a : %d , places restantes",a.places);
               printf("\n                                                                                     Vous devez payer : %d",prix);
    // nouvelle ligne             fseek(f,-2*sizeof(int),SEEK_CUR);
    // nouvelle ligne            fwrite(&a,sizeof(a),1,f);
    // nouvelle ligne            flag=1;
     
                 }
                }
               }
               else
            fread(&a,sizeof(a),1,f);
            }
             else
           printf("\n                                                                                     erreur, ce film n'existe pas!");
                }
              fread(&a,sizeof(a),1,f);
     
     
        }
     
        fclose(f);
      }
      else
        printf("\n                                                                                     erreur, le fichier n'existe pas ");
     
     
    }
    Mais ça ne change rien, quand j'affiche ce qu'il y à dans le fichier , il me réaffiche le nombre de places qu'il y avait avant de faire le calcul ...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Je me suis trompé a la ligne 44, le fseek est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fseek(f,-1*sizeof(a),SEEK_CUR);

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    "rw" n'est pas un mode d'accès valide.
    C'est "r+b" qu'il te faut (lecture+écriture, binaire).
    Au passage, fseek(offset, SEEK_CUR) n'est défini que pour les flux binaires.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Merci pour l'aide, effectivement le mode d'ouverture faisait buguer mais maintenant ça marche (presque ).

    En effet maintenant le nombre de places se décrémente bien, mais il me crée un deuxième record qui ne contient rien à part du vide ...

    Quelqu'un sait d'ou ca peut venir ?

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    J'avais pensaisau b aussi mais j'ai trouvé ça
    The mode string can also include the letter 'b' either as a last
    character or as a character between the characters in any of the two-
    character strings described above. This is strictly for
    compatibility with C89 and has no effect; the 'b' is ignored on all
    POSIX conforming systems, including Linux.
    En tout cas, si ça fonctionne t'en mieux.

    Pour le second record, le problème vient de ce que tu as ajouté. Tu recules ton curseur dans le fichier pour écrire ton nouveau nombre de place mais tu ne le replaces pas après!
    Quand le traitement de ton premier record est terminé, le test feof renvoi faux car il reste les données de la fin de ton premier record après ton curseur, le programme rentre donc encore une fois dans la boucle mais avec des données fausses.

Discussions similaires

  1. Problème avec fwrite d'un short en binaire
    Par gofio79 dans le forum C
    Réponses: 3
    Dernier message: 12/06/2011, 08h35
  2. Réponses: 2
    Dernier message: 23/02/2009, 11h23
  3. Problème avec fwrite sous windows
    Par cerede2000 dans le forum C
    Réponses: 43
    Dernier message: 13/10/2008, 10h24
  4. Problème avec fwrite
    Par NeMo_O dans le forum C
    Réponses: 6
    Dernier message: 19/03/2007, 09h20
  5. Problème avec fwrite() : besoin d'un coup de main
    Par yopuke dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2006, 09h43

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