Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1548 connectés 

  FORUM HardWare.fr
  Programmation
  C

  pb liste chainée et lecture de fichier C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pb liste chainée et lecture de fichier C

n°2128705
toufik135
Posté le 28-02-2012 à 16:53:47  profilanswer
 

Bonjour à tous,
 
j'ai un projet à remettre pour l'école, c'est un programme qui gère le stock d'un magasin composé de structure liste chainée et lecture de fichier principalement.
 
Le soucis est qu'il ne m'affiche pas correctement ce qu'il faut, c'est peut etre un problème au niveau des fgets ou alors de l'allocation en mémoire mais je vois pas où.
 
Si quelqu'un pourrait m'éclairer de sa lumière ce serait sympa...
 
Voici le projet ( j'utilise codeblocks) sur rapidshare, jmet pas le code ici, il est en plusieur fichier (le tout est dans un fichier .rar avec dedans une image de la liste chainée et un screenshot de ce qu'il m'affiche et ce qu'il devrait m'afficher) :
https://rapidshare.com/#!download|9 [...] 4fa3175%29  
 
 
 
Merci.

mood
Publicité
Posté le 28-02-2012 à 16:53:47  profilanswer
 

n°2128752
gilou
Modérateur
Modzilla
Posté le 28-02-2012 à 20:48:15  profilanswer
 

Bon déja en modifiant data.c avec:
 
 

Code :
  1. void printItem(ITEM *item) {
  2.     printf(" - [%d] %s (%s): %.2lf \n", item->id, item->name, item->category, item->price);
  3. }
  4. void printStockItem(STOCKITEM *stockItem) {
  5.     printf(" - [%d] %d unite expirant le %s \n",stockItem->item->id, stockItem->quantity, stockItem->expirationDate);
  6. }


 
et stock.c avec:
 

Code :
  1. void printStock(STOCK *stock) {
  2.     int i;
  3.     if (stock->nbItems) {
  4. printf("%d items\n", stock->nbItems);
  5. for(i = 0; i < stock->nbItems; ++i) {
  6.     printItem(&stock->items[i]);
  7. }
  8. if(stock->size == 0) {
  9.     printf("\n [] \n" );
  10. }
  11. else {
  12.     struct STOCKNODE *current = stock->first;
  13.     printf("%d stockitems\n", stock->size);
  14.     for(i = 0; i < stock->size; ++i) {                      // voir dans data.c
  15.  printStockItem(current->item);                    // voir dans data.c
  16.  current=current->next;
  17.     }
  18. }
  19.     }
  20.     else {
  21. printf("Stock vide\n" );
  22.     }
  23. }
  24. STOCK *loadStock(char *path) {
  25.     STOCK *liste = newStock();                                            //initialisation de la liste
  26.     FILE *file;
  27.     char buff[30];                                                       // ouverture du fichier afin de prendre les éléments pour construire les structures
  28.     int i, id = 0, quantity;
  29.     double price[30];
  30.     char *category[20];
  31.     char *name[30];
  32.     char *expiDate[20];
  33.     char *c;
  34.     if (liste == NULL) {
  35.         return NULL;
  36.     }
  37.     file = fopen(path,"r" );
  38.     if(file == NULL) {
  39.         printf("\n impossible d'ouvrir le fichier %s \n\n",path);
  40.         return NULL;
  41.     }
  42.     fgets(buff,30,file);                                          // lis la première ligne du fichier stock.txt qui correspond au nombre 3 et qui est le nombre d'article
  43.     int nbItems = atoi(buff);
  44.     liste->nbItems = nbItems;
  45.     liste->items = malloc(nbItems * sizeof(ITEM));                  // déclaration du tableau de structures ITEM
  46.     for (i = 0; i < nbItems; ++i) {
  47.         category[i] = malloc(sizeof(buff));
  48.         fgets(buff, 30, file);                                   // lis la ligne suivante et la place dans la variable char category
  49.         if ((c = strrchr(buff, '\n')) != NULL) {
  50.             *c = '\0';          // purge du '\n' terminant chaque ligne d'un fichier texte
  51.         }
  52.         strcpy(category[i], buff);
  53.         name[i] = malloc(sizeof(buff));
  54.         fgets(buff, 30, file);
  55.         if ((c = strrchr(buff, '\n')) != NULL) {
  56.             *c = '\0';   // purge du '\n' terminant chaque ligne d'un fichier texte
  57.         }
  58.         *name[i] = '\0';
  59.         strcpy(name[i], buff);
  60.         fgets(buff, 30, file);
  61.         price[i] = atof(buff);
  62.         liste->items[i] = *buildItem(id, name[i], category[i], price[i]);     // place dans la case i du tableau de structures, la structure construite voir data.c
  63.         id++;
  64.     }
  65.        fgets(buff,30,file);                                            // ligne vide
  66.        for (i = 0; i < nbItems; ++i) {
  67.         fgets(buff, 30, file);
  68.         id = atoi(buff);
  69.         fgets(buff, 30, file);
  70.         quantity = atoi(buff);
  71.         expiDate[i] = malloc(sizeof(buff));
  72.         fgets(buff, 30, file);
  73.         if ((c = strrchr(buff, '\n')) != NULL) {
  74.             *c='\0';   // purge du '\n' terminant chaque ligne d'un fichier texte
  75.         }
  76.         strcpy(expiDate[i], buff);
  77.         STOCKITEM *receive_stock = malloc(sizeof(STOCKITEM));
  78.         receive_stock = buildStockItem(&liste->items[i], quantity, expiDate[i]);             //créaction d'une structure STOCKITEM au fur et a mesure qu'on parcourt la liste
  79.         // liste->items[id] = *receive_stock->item;
  80.         addToStock(liste, receive_stock);                                               // on ajoute ce qu'on a construit
  81. }
  82.    
  83.     fclose(file);
  84.     return liste;
  85. }


 
et en virant tous les blancs inutiles de stock.txt
 

3
DVD
Les Simpson - Saison 14
12.99
Livre
Langage C
7.99
Charcuterie
Jambon Cuit - 4 tranches
3.99
 
0
10
-
2
10
25/12/2011
1
1
-
2
5
27/12/2011


On obtient un truc qui marche presque:

3 items
 - [0] Les Simpson - Saison 14 (DVD): 12.99
 - [1] Langage C (Livre): 7.99
 - [2] Jambon Cuit - 4 tranches (Charcuterie): 3.99
3 stockitems
 - [0] 10 unite expirant le -
 - [1] 10 unite expirant le 25/12/2011
 - [2] 1 unite expirant le -


 
Mais la ou on tombe sur ton erreur de conception, c'est ici:

Citation :


 
       fgets(buff,30,file);                                            // ligne vide
 
      for (i = 0; i < nbItems; ++i) {
        fgets(buff, 30, file);
        id = atoi(buff);
 
        fgets(buff, 30, file);
        quantity = atoi(buff);
 

Il y a aucune raison que le nb de stockitems soit égal au nb d'items, dans ton fichier d'ailleurs, 3 items et 4 stockitems, et ton code fait qu'on n'en lit que 3.
 
Commences par penser à un format plus utilisable (s'il ne t'es pas imposé) comme fichier de sauvegarde des stocks pour t'en sortir
- soit en notant le nb de stockitems
- soit en ayant une marque de suite d'items et une de suite de stockitems en tête de ce type d'enregistrement (avec une fin par exemple quand on rencontre une nouvelle marque)
ou autre (lecture de tous les stockitems jusqu'a la fin du fichier, etc), en faisant gaffe de choisir une solution qui puisse évoluer si ton projet le fait (si tu dois pouvoir ajouter des items et des stockitems à l'avenir par exemple)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  pb liste chainée et lecture de fichier C

 

Sujets relatifs
Mise a jour automatique fichier excelLecture de gros fichiers CSV sur Android
Liste chainee avec le mot cle THISRécupérer le contenu d'une liste dans un logiciel
besoin d'aide programmation COptimisation et multi-thread en C
[C#] WCF Routing et WIFdeveloppement application partage fichier avec metadata en java
Plus de sujets relatifs à : pb liste chainée et lecture de fichier C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR