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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    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 éprouvé
    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
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    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
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.

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