Probleme de listes chainnees

kcmx Messages postés 4 Date d'inscription samedi 7 septembre 2013 Statut Membre Dernière intervention 11 janvier 2015 - Modifié par Whismeril le 20/05/2014 à 06:30
kcmx Messages postés 4 Date d'inscription samedi 7 septembre 2013 Statut Membre Dernière intervention 11 janvier 2015 - 21 mai 2014 à 00:29
Bonjour cher(es) ami(es),j'espère que vous allez très bien! Je suis encore parmi vous,pour vous poser mon problème avec les listes chainées.Nous avons un fichier contenant les données relatives a la structure définis(produit). Ces données de différents types doivent être chargées a partir d'une liste chainée,et afficher exactement comme dans le fichier .txt.Lorsqu'on tente le chargement ,a l'affichage on a des valeurs binaires,en gros rien de compréhensif ne s'affiche. Ci-dessous notre code sources.

 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct produit
  {
    char nom[30]; //lettre alphabet
    float prix; // prix unitaire
    int quantite;//quantité du produit
    }produit;
typedef struct element{
    produit pdts;
    struct element *suiv;
  } element;
 typedef struct element *eee;
 eee Listes;
   
   
   
   
  Listes creerListe()
  {
      
    FILE * fichier;
    produit pdt;
    eee q, p=NULL;
  
    fichier = fopen("dataBase.txt","r"); //ouverture du fichier en lecture
  
    while (!feof(fichier))
     {
       
    fread(&pdt,sizeof(produit),1,fichier);
     
    q=(eee*) malloc(sizeof(element));
    q->pdts=pdt;
    q->suiv=p;
    p=q;
     }
    return p;  
   
  }
   
  void afficher(eee L)
  {
    eee p= L;
    while (p!=NULL)
    {
       printf("%s\t%f\t%s\n",p->pdts.nom,p->pdts.prix,p->pdts.quantite);
       p=p->suiv;    
    }
  }
   
  void main(){
    eee table;
    printf("\n\t Chargement de la Base de donnée en cours");
    for(i=1;i<4;i++){
    printf(".");
    sleep(i);}
    table=creerListe()
    clrscr();
    printf("\n\t Reuissi!!!\n\n\tContenu de a Base:");
    afficher(table);
    getch();
    } 


Merciii d'avance pour votre aide!!!!!!

3 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
20 mai 2014 à 06:32
Bonjour, la balise de fin de la coloration syntaxique est </code>. Je l'ai corrigée pour que ton message soit plus lisible, sinon tu peux te servir de la liste déroulante comme expliqué ici.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 20/05/2014 à 16:42
Bonjour.

La seule erreur classique que je vois est sur la non compréhension de ce que fait "feof". Il ne dit pas si on est en fin de fichier, mais si, en cas d'erreur, l'erreur levée est une fin de fichier. Ce n'est pas tout à fait pareil. Il faut donc tester si erreur il y a eu (en regardant la valeur de retour de fread) et vérifier si c'est une erreur fichier ou non.

Au niveau du code:
- Plein de variables très mal nommées, que je me suis permis de renommer (Notamment le "eee" qui est franchement abusif).
- Si c'est bien un compilateur C et non C++, alors il n'y a pas besoin de "caster" le retour du malloc (attention de ne pas utiliser un compilateur C++ pour faire du C. Les langages sont compatibles à 99%, pas à 100%, et ça peut être une source de surprise...).
- La fonction main renvoit *toujours* un entier. La bonne signature est donc: "int main(void)" et non "void main()"
- Rien n'était libéré (bonjour les fuites mémoires !)
- Les fichiers n'étaient pas fermés.


J'ai ajouté un exemple (parce que sans exemple, impossible d'aider) et une gestion des erreurs (chose pas faite du tout).
Merci la prochaine fois, de joindre le fichier qui est censé être lu, sinon il est difficile d'aider...

Voici le code corrigé:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
  char nom[30];
  double prix;
  int quantite;
} Produit;

typedef struct Element
{
  Produit produit;
  struct Element* suiv;
} Element;

void freeList(Element* elt)
{
  Element* tmp = NULL;
  while (elt != NULL)
  {
    tmp = elt;
    elt = elt->suiv;
    free(tmp);
  }
}

Element* chargerListe(const char* filename)
{
  FILE* fichier = NULL;
  Produit produit;
  Element* q = NULL;
  Element* p = NULL;
  int res = 0;

  fichier = fopen(filename, "rb");
  if (!fichier)
    return NULL;

  while (!feof(fichier) && !ferror(fichier))
  {
    res = fread(&produit, sizeof(Produit), 1, fichier);
    if (res <= 0 && feof(fichier))
      break;

    if (res != 1)
    {
      printf("Error while loading the file: %s!"
      " Expected to read 1 product but read %i.\n", filename, res);
      freeList(q);
      fclose(fichier);
      return NULL;
    }
    q = malloc(1 * sizeof(Element));
    q->produit = produit;
    q->suiv = p;
    p = q;
  }
  fclose(fichier);

  return p;
}

int save(const Element* elt, const char* filename)
{
  FILE* fichier = NULL;
  int res = 0;

  fichier = fopen(filename, "w");
  if (!fichier)
    return 0;

  while (elt != NULL)
  {
    res = fwrite(&elt->produit, sizeof(Produit), 1, fichier);
    if (res != 1)
      return 0;
    elt = elt->suiv;
  }

  fclose(fichier);
  return 1;
}

void afficher(const Element* elt)
{
  while (elt != NULL)
  {
    printf("%s\t%f\t%i\n",elt->produit.nom,
    elt->produit.prix, elt->produit.quantite);
    elt = elt->suiv;
  }
}

Element* createExample(void)
{
  Element* table = NULL;
  Element* next = NULL;

  next = malloc(1 * sizeof(Produit));
  strcpy(next->produit.nom, "tata");
  next->produit.prix = 40;
  next->produit.quantite = 74;
  next->suiv = NULL;

  table = malloc(1 * sizeof(Produit));
  strcpy(table->produit.nom, "toto");
  table->produit.prix = 10;
  table->produit.quantite = 29;
  table->suiv = next;

  return table;
}

int main(void)
{
  const char* filename = "database.txt";
  Element* table = NULL;
  Element* example = createExample();
  afficher(example);
  save(example, filename);
  freeList(example);

  printf("Chargement de la Base de donnée en cours...\n");
  table = chargerListe(filename);
  if (table)
  {
    printf("Contenu de la base:\n");
    afficher(table);
  }
  else
    printf("Echec du chargement du fichier: %s\n", filename);

  freeList(table);

  return 0;
}


__________________________________________________________________________________________________
Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
kcmx Messages postés 4 Date d'inscription samedi 7 septembre 2013 Statut Membre Dernière intervention 11 janvier 2015
21 mai 2014 à 00:29
Bonsoir,tout d'abord mercii beaucooup pour la correction!!C'est vraiment du bon boulot!!Je tiendrai compte de vos suggestions pertinentes!!Bon avec votre code source,nous avons essayer de mieux comprendre et je vous donnerez le code source.Nous voulons d'abord creer une liste chainee a partir des donnees d'un fichier; ce fichier contient des donnees de types differents et cette liste nous servira pour un esemble de traitement et peut etre affichee a l'ecran de maniere a ce qu'on puisse le lire...

Bon grossomodo,c'est a peu pres sa! Mercii d'avance!!!







#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

typedef struct
{
  char nom[30];
  double prix;
  int quantite;
} Produit;

typedef struct Element
{
  Produit produit;
  struct Element* suiv;
} Element;

void freeList(Element* elt)
{
  Element* tmp = NULL;
  while (elt != NULL)
  {
    tmp = elt;
    elt = elt->suiv;
    free(tmp);
  }
}

Element* chargerListe(const char* filename)
{
  FILE* fichier = NULL;
  Produit produit;
  Element* q = NULL;
  Element* p = NULL;
  int res = 0;

  fichier = fopen(filename, "rb");
  if (!fichier)
    return NULL;

  while (!feof(fichier) && !ferror(fichier))
  {
    res = fread(&produit, sizeof(Produit), 1, fichier);
    if (res <= 0 && feof(fichier))
      break;

    if (res != 1)
    {
      ferror(fichier);
      printf("Error while loading the file: %s!"
	     " Expected to read 1 product but read %d.\n", filename, res);
      freeList(q);
      fclose(fichier);
      return NULL;
    }
    q = malloc(1 * sizeof(Element));
    q->produit = produit;
    q->suiv = p;
    p = q;
  }
  fclose(fichier);
 
  return p;
}

int save(const Element* elt, const char* filename)
{
  FILE* fichier = NULL;
  int res = 0;

  fichier = fopen(filename, "w");
  if (!fichier)
    return 0;

  while (elt != NULL)
  {
    res = fwrite(&elt->produit, sizeof(Produit), 1, fichier);
    if (res != 1)
      return 0;
    elt = elt->suiv;
  }

  fclose(fichier);
  return 1;
}

void afficher(const Element* elt)
{
  while (elt != NULL)
  {
    printf("%s\t%f\t%d\n",elt->produit.nom,
	   elt->produit.prix, elt->produit.quantite);
    elt = elt->suiv;
  }
}

Element* createExample(void)
{
  Element* table = NULL;
  Element* next = NULL;

  next = malloc(1 * sizeof(Produit));
  strcpy(next->produit.nom, "tata");
  next->produit.prix = 40;
  next->produit.quantite = 74;
  next->suiv = NULL;

  table = malloc(1 * sizeof(Produit));
  strcpy(table->produit.nom, "toto");
  table->produit.prix = 10;
  table->produit.quantite = 29;
  table->suiv = next;

  return table;
}

int main(void)
{
  const char* filename = "dataBase.txt";
  Element* table = NULL;
  Element* example = createExample();
  afficher(example);
  save(example, filename);
  freeList(example);

  printf("Chargement de la Base de donnée en cours...\n");
  table = chargerListe(filename);
  if (table)
  {
    printf("Contenu de la base:\n");
    afficher(table);
  }
  else
    printf("Echec du chargement du fichier: %s\n", filename);

  freeList(table);

  return 0;
}


0
Rejoignez-nous