pb liste chainée et lecture de fichier C

pb liste chainée et lecture de fichier C - C - Programmation

Marsh Posté le 28-02-2012 à 16:53:47    

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.

Reply

Marsh Posté le 28-02-2012 à 16:53:47   

Reply

Marsh Posté le 28-02-2012 à 20:48:15    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed