Liste chainée dans un fichier

Liste chainée dans un fichier - C - Programmation

Marsh Posté le 29-04-2006 à 09:49:56    

Bonjour,
 
J'aimerais savoir comment fait on pour enregistrer les données d'une liste chainée unidirectionnel dans un fichier et comment reprendre ces données du fichier pour les afficher ?
Je sais qu'il faut utiliser fread et fwrite mais lorsque je le fais , a mon avis je dois perdre l'adresse de tete.
 
Voici mon code, si vous pouviez me dire ou je dois mettre ces 2 fonctions ?
 
Merci

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<conio.h>
  5. struct DATTE { int jour;
  6.                int mois;
  7.      int annee;
  8. };
  9. struct COMPETITION { long NumCompetition;
  10.      char nomKata[30];
  11.         struct DATTE datecompet;
  12.         struct COMPETITION *psuivant;
  13. };
  14. void Creation_Fichier(struct COMPETITION *);
  15. void Ajout_Compet(struct COMPETITION **);
  16. void Afficher_Compet(struct COMPETITION *);
  17. void main()
  18. {
  19. struct COMPETITION *compet;
  20. bool fin;
  21. int choix;
  22. compet = NULL;
  23. do
  24. {
  25.  system("cls" );
  26.  fin = false;
  27.  printf("\n\n                            MENU\n" );
  28.  printf("                            ----\n" );
  29.  printf("                       1.  Ajouter une competition\n" );
  30.  printf("                       2.  Afficher la liste des competitions\n" );
  31.  printf("                       3.  Quitter\n" );
  32.  printf("\n               Choix : " );
  33.  fflush(stdin);
  34.  scanf("%d", &choix);
  35.  switch(choix)
  36.  {
  37.  case 1:
  38.   Ajout_Compet(&compet);
  39.   break;
  40.  case 2:
  41.   Afficher_Compet(compet);
  42.   break;
  43.  default:
  44.   fin = true;
  45.   break;
  46.  }
  47. }while(fin == false);
  48. }
  49. void Ajout_Compet(struct COMPETITION **compet)
  50. {
  51. struct COMPETITION *nouveau, *pcourant;
  52. bool trouve;
  53. int jour, mois, annee;
  54. trouve = false;
  55. system("cls" );
  56. nouveau = (struct COMPETITION *)malloc(sizeof(struct COMPETITION));
  57. printf(" * Numero de la competition : " );
  58. fflush(stdin);
  59. scanf("%d", &nouveau->NumCompetition);
  60. printf(" * Nom du KATA : " );
  61. fflush(stdin);
  62. gets(nouveau->nomKata);
  63. printf(" * Entrez le jour :" );
  64. fflush(stdin);
  65. scanf("%d", &jour);
  66. nouveau->datecompet.jour = jour;
  67. printf(" * Entrez le mois :" );
  68. fflush(stdin);
  69. scanf("%d", &mois);
  70. nouveau->datecompet.mois = mois;
  71. printf(" * Entrez l annee :" );
  72. fflush(stdin);
  73. scanf("%d", &annee);
  74. nouveau->datecompet.annee = annee;
  75. if(*compet == NULL)
  76. {
  77.  *compet = nouveau;
  78.  nouveau->psuivant = NULL;
  79. }
  80. else
  81. {
  82.  pcourant = *compet;
  83.  while(pcourant->psuivant != NULL)
  84.  {
  85.   pcourant = pcourant->psuivant;
  86.  }
  87.  pcourant->psuivant = nouveau;
  88.  nouveau->psuivant = NULL;
  89. }
  90. }
  91. void Afficher_Compet(struct COMPETITION *compet)
  92. {
  93. system("cls" );
  94. printf("\n\n                           LISTAGE\n" );
  95. printf("                           -------\n\n" );
  96. while(compet != NULL)
  97. {
  98.  printf(" * %d %s %d/%d/%d", compet->NumCompetition, compet->nomKata, compet->datecompet.jour, compet->datecompet.mois, compet->datecompet.annee);
  99.  compet = compet->psuivant;
  100.  printf("\n" );
  101. }
  102. printf("\nAppuyer sur une touche pour continuer..." );
  103. getch();
  104. }

Reply

Marsh Posté le 29-04-2006 à 09:49:56   

Reply

Marsh Posté le 29-04-2006 à 10:04:16    

Tu l'enregistres comme une liste classique, genre en CSV si tu veux que ce soit humainement lisible [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 29-04-2006 à 10:08:24    

Je n'ai pas lu ton code, (j'aurais peut-être du), mais tu peux lire le fichier en début de programme, et  l'écrire en fin de programme (ou à chauqse ajout/suppression dans la liste).
Le principe est le suivant
la structure de ta liste chaînee

Code :
  1. typedef struct lst
  2. {
  3.    data *ptrdata; // un pointeur vers les données
  4.   lst *suivant;
  5. } lst


 
 
ecriture des data

Code :
  1. lst *ptr = deb:
  2. fout = ouverture_des_data_en_ecriture();
  3. while (ptr != NULL)
  4. {
  5.    ecriture_des_donnees(fout, ptr->ptrdata);
  6.    ptr = ptr->suivant;
  7. }
  8. fermeture_des_data();


lecture des données

Code :
  1. lst *ptr = NULL;
  2. data *ptrdata;
  3. fin = ouverture_des_data_en_lecture();
  4. while((ptrdata = lecture(fin)) != NULL)
  5. {
  6.     ptr = insertion_des_donnees(ptr, ptrdata);
  7. }
  8. fermeture_des_data();


 
Maintenant, pour l'écriture des données, tu peux utiliser un fwrite(ptr->ptrdata, sizeof(data), 1, fout) méthode simple mais qui n'est pas portable d'un système à l'autre (problèmes d'endianess) ou alors tu écris tes données au format CSV tout ce qu'il y a de plus portable.
 
La lecture des données dépendra évidemment du format d'écriture.  
 
L'insertion des données est une simple insertion dans une liste chaînée, on trouve les algos partout sur le net.
 
Je viens de survoler ce que tu as écrit :
fflush(stdin); non standart, peut provoquer des comportement indéfinis, à proscrire
gets : bug connu, à proscrire.
scanf : fonction TRES difficile à utiliser, utilise fgets(tmp, sizeof(tmp), stdin);


Message édité par Trap D le 29-04-2006 à 10:10:50
Reply

Marsh Posté le 29-04-2006 à 20:37:00    

Merci pour ton aide, l'écriture se passe sans problème mais je n'arrive toujours pas à reprendre les données du fichier pour les afficher !!
Je préfere utiliser des fread et fwrite car je n'ai pas vu les fout, ....
 
Voila ma fonction afficher :
Mon programme plante au niveau du fread (debugger)  :??:  
 
Merci

Code :
  1. void Afficher_Compet(struct COMPETITION *compet)
  2. {
  3. FILE *fp;
  4. struct COMPETITION *lecture;
  5. fp = fopen("competition.dat", "r+b" );
  6. while(feof(fp) == 0)
  7. {
  8.  fread(lecture, sizeof(struct COMPETITION), 1, fp);      :fou:
  9.  lecture->psuivant = compet;
  10.  compet = lecture;
  11. }
  12. fclose(fp);
  13. system("cls" );
  14. printf("\n\n                           LISTAGE\n" );
  15. printf("                           -------\n\n" );
  16. while(compet != NULL)
  17. {
  18.  printf(" * %d %s %d/%d/%d", compet->NumCompetition, compet->nomKata, compet->datecompet.jour, compet->datecompet.mois, compet->datecompet.annee);
  19.  compet = compet->psuivant;
  20.  printf("\n" );
  21. }
  22. printf("\nAppuyer sur une touche pour continuer..." );
  23. getch();
  24. }

Reply

Marsh Posté le 29-04-2006 à 23:06:59    

MAD_DIM a écrit :

Code :
  1. while(feof(fp) == 0)



 
feof() ne sert pas à détecter la fin d'un fichier. Pour ça, il suffit de récupérer la valeur renvoyée par "fread()" qui renvoie le nb d'éléments lus. Si ce nb est "0", c'est qu'il n'y a plus rien à lire donc que tout le fichier a été traité.
feof() sert uniquement à t'indiquer si, en cas d'arrêt de la lecture, si l'arrêt est dû à l'évènement "fin de fichier" ou pas...
 
Sinon, ce serait plus portable de décomposer tes tâches en fonctions et de créer une fonction spéciale pour insérer un élément dans ta liste. Ensuite, que l'élément vienne d'un fichier ou d'ailleurs importe peu. Une fois que tu l'as, tu appelles toujours la même fonction pour l'insérer...


Message édité par Sve@r le 29-04-2006 à 23:07:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 29-04-2006 à 23:09:27    

En clair, faire de la POO en C :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 30-04-2006 à 09:24:48    

MAD_DIM a écrit :


Mon programme plante au niveau du fread (debugger)  :??:  

Code :
  1. void Afficher_Compet(struct COMPETITION *compet)
  2. {
  3. struct COMPETITION *lecture;
  4.         <...>
  5.  fread(lecture, sizeof(struct COMPETITION), 1, fp);
  6. }



'lecture' est un pointeur non initialisé. Sa valeur est indéterminée. Passer une valeur indéterminée à une fonction invoque un comportement indéfini. Tout peut arriver.
 
Tu veux sans doute :  

Code :
  1. void Afficher_Compet(struct COMPETITION *compet)
  2. {
  3. struct COMPETITION lecture;
  4.         <...>
  5.  fread (&lecture, sizeof lecture, 1, fp);
  6. }



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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