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

  FORUM HardWare.fr
  Programmation
  C

  Liste chainée dans un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Liste chainée dans un fichier

n°1356384
MAD_DIM
Posté le 29-04-2006 à 09:49:56  profilanswer
 

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. }

mood
Publicité
Posté le 29-04-2006 à 09:49:56  profilanswer
 

n°1356387
masklinn
í dag viðrar vel til loftárása
Posté le 29-04-2006 à 10:04:16  profilanswer
 

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
n°1356390
Trap D
Posté le 29-04-2006 à 10:08:24  profilanswer
 

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
n°1356610
MAD_DIM
Posté le 29-04-2006 à 20:37:00  profilanswer
 

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. }

n°1356633
Sve@r
Posté le 29-04-2006 à 23:06:59  profilanswer
 

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.
n°1356635
masklinn
í dag viðrar vel til loftárása
Posté le 29-04-2006 à 23:09:27  profilanswer
 

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
n°1356680
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-04-2006 à 09:24:48  profilanswer
 

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/

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

  Liste chainée dans un fichier

 

Sujets relatifs
Tester la connectivité d'une liste de machines[C#] Créer un fichier Excel
Lancer un fichierRESOLU :comment générer un fichier excel depuis Cshell
Dectecter un Disque dur USB et executer un fichiercopie intranet de fichier en php
access - zone de liste à sélection multipleProblème de Procedure avec liste chainée et fichier
liste chainée et traitemenbts de fichierPbs structure en liste chainée et manip de fichier
Plus de sujets relatifs à : Liste chainée dans un fichier


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