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 :

Tableau de structures dans un fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Tableau de structures dans un fichier
    Bonjour. Je voudrais créer un fichier conteant les produits achetés par un client. Voici le code, mais ce programme n'arrive pas à insérer dans le fichier qu'il crée. voici 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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    #include<dos.h>
    #include <alloc.h>
    #include <time.h>
     
    typedef struct{
      int codeprod;
      char nomprod[30];
      int qte;
     
    }Produit;
     
    typedef struct{
      int codecl; //code client
      Produit commande[20];//Taleaux des produits achetés par le client
      int nbreprod;//nombre de produits différents achetés
    }Achat;
     
     
     
    void SaveAchat()
    {
      FILE *P_FICHIER;
      char NOM_FICHIER[30], nomprod[30];
      int  CPT, NB_ENREG, codecl, codeprod,qte;
     
      Produit UnProduit;
     
      Achat UnAchat;
      clrscr();
      //
     
      printf("Entrez le nom du fichier d'achats à créer : ");
      scanf("%s",NOM_FICHIER);
     
      P_FICHIER = fopen(NOM_FICHIER, "w");  /* write */
     
      printf("Entrez le code du client : ");
      scanf("%d", &codecl);
      UnAchat.codecl = codecl;
      printf("Entrez le nombre de produits achet‚s : ");
      scanf("%d", &NB_ENREG);
      flushall();
      CPT = 0;
      while (CPT<NB_ENREG)
      {  printf("********* Produit N° %d *******************\n",CPT+1);
         printf("Entrez le code :");
         scanf("%d",&UnProduit.codeprod);
         flushall();
         printf("Entrez le nom :");
         scanf("%s",UnProduit.nomprod);
         printf("Entrez la quantite‚ : ");
         scanf("%d",&UnProduit.qte);
         flushall();
         UnAchat.commande[CPT] = UnProduit;
         CPT++;
       }
       UnAchat.nbreprod = NB_ENREG;
       fwrite(&UnAchat, sizeof(Achat), 1, P_FICHIER);
       fclose(P_FICHIER);
     
    }
     
    void OpenAchat()
    {
      FILE *P_FICHIER;
      char NOM_FICHIER[30];
      Achat UnAchat;
      int code,i;
      clrscr();
      printf("Entrez le nom du fichier d'achats … ouvrir : ");
      scanf("%s",NOM_FICHIER);
      P_FICHIER = fopen(NOM_FICHIER, "r");
     
      while(fread(&UnAchat, sizeof(Achat), 1, P_FICHIER) !=0)
      { printf("Code client : \n", UnAchat.codel;
        for(i = 0;i < UnAchat.nbreprod; i++)
        { printf("Code du produit : %d \n",UnAchat.commande[i].codeprod);
          printf("Nom du produit : %s \n",UnAchat.commande[i].nomprod);
        }
      }
     
      fclose(P_FICHIER);
      getch();
     
    }
     
    void main()
    { clrscr();
      SaveAchat();
      OpenAchat();
     
    }
    Je sollicite votre aide...

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    La source de ton problème : tu dois utiliser les modes "wb" et "rb" et non "w" et "r", puisque tu n'écris pas que du texte.

    Autres remarques :

    - Si tu veux écrire un achat dans un fichier, c'est mieux de juste écrire :
    * L'en-tête (codeclient et nbprod)
    * Les nbprod produits achetés
    C'est-à-dire qu'il faut procéder en deux fwrite ou réorganiser la déclaration de la structure (déclarer le tableau à la fin) et faire un seul fwrite intelligent ...

    - J'espère que t'es conscient que tu utilises plein de fonctions/en-têtes non standard (clrscr, flushall, dos.h, alloc.h), alors que tu bien écrire le programme sans.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Tableau de structures dans un fichier
    Merci Melem. Mais si je n'utilise pas de tableau pour stocker les produits achetés lors d'un achat, comment est-ce que je vais pouvoir retrouver les produits concernés par un achat ? Vous me suggerez deux fwrite, mais je ne comprend bien ce que vous voulez dire par là.
    Mon but est de créer un fichier d'achats. Et pour chaque achat, on doit connaître le montant total, les produits achetés.

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Merci Melem. Mais si je n'utilise pas de tableau pour stocker les produits achetés lors d'un achat, comment est-ce que je vais pouvoir retrouver les produits concernés par un achat ?
    J'ai dit ça ?

    Vous me suggerez deux fwrite, mais je ne comprend bien ce que vous voulez dire par là.
    Normal si t'as pas compris, il en faut en fait 3 . Bref, ce que je voulais dire au départ c'est "écrire juste ce qui est nécessaire", ce qui se fait en effet, à cause du bazar dans ta structure, en 3 fwrite. Pour écrire un Achat donc, on fera comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fwrite(&UnAchat.codeclient, sizeof(UnAchat.codeclient), 1, P_FICHIER);
    fwrite(&UnAchat.nbprod, sizeof(UnAchat.nbprod), 1, P_FICHIER);
    fwrite(&UnAchat.commande, sizeof(UnAchat.commande[0]), UnAchat.nbprod, P_FICHIER);
    J'ai aussi dit que ça serait aussi bien si tu déclarais les membres dans cet ordre. C'est non plus "logique", et ça peut surtout réduire le code à un seul fwrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(&UnAchat, offsetof(Achat, commande) + UnAchat.nbprod, 1, P_FICHIER);
    offsetof, c'est une macro standard qui retourne le taille d'une structure jusqu'au champ spécifié.

    Une fois que tu as opté pour une méthode, tu dois utiliser cette même méthode pour la lecture et l'écriture. En effet, entre les champs d'une structure, il peut y avoir des espaces "vides". Ecrire une structure d'un coup donc, par exemple, n'est pas la même chose qu'écrire les membres un par un.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Tableau de structures dans un fichier
    Ok Melem. J'ai compris. Je vais utiliser un seul fwrite. A bientôt.

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Tableau de structures dans un fichier
    Salut. En écrivant pour la création du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fwrite(&UnAchat, offsetof(Achat, commande) + UnAchat.nbprod, 1, P_FICHIER);
    et pour la lecture du fchier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while(fread(&UnAchat,offsetof(Achat, commande) + UnAchat.nbprod, 1, P_FICHIER) !=0)
      {
        for(i = 0;i < UnAchat.nbreprod; i++)
        { printf("Code du produit : %d \n",UnAchat.commande[i].codeprod);
          printf("Nom du produit : %s \n",UnAchat.commande[i].nomprod);
          printf("Quantit‚ : %s \n",UnAchat.commande[i].qte);
          printf("Nombre de produit : %d \n",UnAchat.nbreprod);
          printf("\n");
        }
      }
    le nom du produit n'est pas affiché. Peut-être que la taille donnée par : offsetof(Achat, commande) + UnAchat.nbprod, n'est pas réellement celle de la structure Achat ?

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    J'aurais aimé que tu aies su corrigé cela toi-même, mais bon. La bonne taille est en effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    offsetof(Achat, commande) + (UnAchat.nbprod * sizeof(UnAchat.commande[0]))
    Les parenthèses qui entourent la multiplication sont inutiles, c'est juste pour que tu comprennes mieux. Et je rappelle que cela n'écrit pas la structure entière, juste ce qui est nécessaire (c'est-à-dire qu'on écrit pas les éléments du tableau commande qui "ne contiennent rien").

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Tableau de structures dans un fichier
    Merci bcp Melem. Tes suggestions ont resolu mon problème. Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecriture d'un tableau de structure dans un fichier
    Par aristide2012 dans le forum Débuter
    Réponses: 5
    Dernier message: 09/10/2012, 16h24
  2. Réponses: 4
    Dernier message: 29/04/2008, 09h52
  3. stocker une structure dans un fichier ini?
    Par Mickey.jet dans le forum C
    Réponses: 6
    Dernier message: 13/09/2006, 16h57
  4. copier une structure dans un fichier
    Par brute dans le forum MFC
    Réponses: 18
    Dernier message: 10/03/2006, 14h30
  5. Problème de rangement de structure dans un fichier ...
    Par Freeze dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/12/2003, 16h46

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