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

  FORUM HardWare.fr
  Programmation
  C

  Enregistrement liste chaînée sur .bin

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Enregistrement liste chaînée sur .bin

n°1395017
misfu
Posté le 26-06-2006 à 15:14:30  profilanswer
 

Bonjour,  
 
pour un projet étudiant, je dois entre autre faire une fonction permettant de sauvegarder des informations en listes chaînées sur un fichier binaire.
 
seulement voilà, je ne m'y connais pas beaucoup en fichier (surtout binaires) et l'organisation de mes differentes structures m'empêchent de faire un truc "basique".
 
voici ces structures :
 

Code :
  1. typedef struct s_Absences
  2. {
  3. char Intitule[50] ;
  4. int jour, mois, annee, heure, minute, points  ;
  5. int justif ;
  6. struct s_Absences * AbsenceSuivante ;
  7. }Absence;
  8. typedef struct s_Eleve
  9. {
  10. char nom[20] ;
  11. char prenom[20] ;
  12. Absence * PremiereAbsence ;
  13. struct s_Eleve * EleveSuivant ;
  14. }Eleve;
  15. typedef struct s_Promo
  16. {
  17. char NomPromo[6] ;
  18. Eleve * PremierEleve ;
  19. struct s_Promo * PromoSuivante ;
  20. }Promo;


 
Le but serait d'acrire sur un fichier binaire : [Eleve 1] [Absence 1] [Absence 2] [Absence n] [Eleve 2] [Absence 1] .... [Eleve n]
 
Bien sur, nous devons faire une autre fonction permettant de charger ces informations :

  • Du fichier Binaire
  • Mais aussi d'un fichier .txt edité a la main, sur lequel figurent les promo, et les élèves les composant, de la forme :  

[Promo] Promotion 1
[Eleve] NomEleve1 PrénomEleve1
[Eleve] NomEleve2 PrénomEleve2
[Promo] Promotion 2
...
 
On est un petit peu perdus dans tout ça, merci d'avance pour votre aide.
 
misfu
 
PS : un prof nous a suggéré d'utiliser une Union, mais on comprend pas toutes suptilités de celles-ci.

mood
Publicité
Posté le 26-06-2006 à 15:14:30  profilanswer
 

n°1395102
Taz
bisounours-codeur
Posté le 26-06-2006 à 16:24:36  profilanswer
 

enregistre dans ton fichier sous forme de tableau. comme ça t'écris tout en un seul fwrite.

n°1395396
Trap D
Posté le 26-06-2006 à 23:24:16  profilanswer
 

Ce sont simplement des boucles tant que : par exemple pour la promo

Code :
  1. procedure AffichagePromo(argument premierPromo de type Promo)
  2. Variable
  3. tmpPromo : type Promo
  4. tmpEleve : type Eleve
  5. debut
  6.   tmpPromo <- premierPromo
  7.   tant que tmpPromo <> NULL faire
  8.     ecrire dans le fichier le nom de la promo
  9.     tmpEleve <- tmpPromo->PremierEleve
  10.     tant que tmpEleve <> NULL faire
  11.       ecrire dans le fichier le nom de l'eleve
  12.       tmpEleve <- tmpEleve->EleveSuivant
  13.     fin tant que
  14.     ecrire dans le fichier un "eleve_vide"
  15.     tmpPromo <- tmpPromo->PromoSuivante
  16.   fin tant que
  17. fin


Maintenant l'ecriture dans le fichier peut se faire de plusieurs manières  différentes
sous forme binaire avec des fwrite mais il faut créer un enregistrement élève vide pour signaler la fin de la  promo
sous forme CSV format texte, une ligne d'enregistrement comportant en premier le nom de la promo puis ensuite les noms des élèves séparés par des , ou des ; c'est le format le plus portable et facile à maintenir.
 
[edit] ce que j'ai écrit ne correspond pas exactement à ce qui est demandé, mais on peut fortement s'en inspirer [/edit]  
Pour lire les fichiers, il faut "simplement" regarder comment ils ont été enregistrés et faire l'inverse.


Message édité par Trap D le 26-06-2006 à 23:31:35
n°1395402
Sve@r
Posté le 26-06-2006 à 23:28:20  profilanswer
 

misfu a écrit :

Bonjour,  
 
pour un projet étudiant, je dois entre autre faire une fonction permettant de sauvegarder des informations en listes chaînées sur un fichier binaire.
 
seulement voilà, je ne m'y connais pas beaucoup en fichier (surtout binaires) et l'organisation de mes differentes structures m'empêchent de faire un truc "basique".
 
voici ces structures :
 

Code :
  1. typedef struct s_Absences
  2. {
  3. char Intitule[50] ;
  4. int jour, mois, annee, heure, minute, points  ;
  5. int justif ;
  6. struct s_Absences * AbsenceSuivante ;
  7. }Absence;
  8. typedef struct s_Eleve
  9. {
  10. char nom[20] ;
  11. char prenom[20] ;
  12. Absence * PremiereAbsence ;
  13. struct s_Eleve * EleveSuivant ;
  14. }Eleve;
  15. typedef struct s_Promo
  16. {
  17. char NomPromo[6] ;
  18. Eleve * PremierEleve ;
  19. struct s_Promo * PromoSuivante ;
  20. }Promo;


 
Le but serait d'acrire sur un fichier binaire : [Eleve 1] [Absence 1] [Absence 2] [Absence n] [Eleve 2] [Absence 1] .... [Eleve n]
 
Bien sur, nous devons faire une autre fonction permettant de charger ces informations :

  • Du fichier Binaire
  • Mais aussi d'un fichier .txt edité a la main, sur lequel figurent les promo, et les élèves les composant, de la forme :  

[Promo] Promotion 1
[Eleve] NomEleve1 PrénomEleve1
[Eleve] NomEleve2 PrénomEleve2
[Promo] Promotion 2
...
 
On est un petit peu perdus dans tout ça, merci d'avance pour votre aide.


Faut bien que tu comprennes qu'une liste chaînée est un objet contenant des données plus l'adresse de la structure suivante. Mais cette adresse a été donnée lorsque la structure a été créée en mémoire donc il ne sert à rien de la sauvegarder sur disque.
Il te faut
- une fonction qui écrit les données de chaque cellule dans un fichier
- une fonction qui charge les données d'une cellule à partir d'un fichier
- une fonction qui crée la cellule en mémoire et la remplit des données chargées
Ensuite, pour la sauvegarde, tu boucles sur ta liste et tu écrits le fichier avec la fonction 1
Pour la restauration, tu boucles sur la fonction 2 et tu recrées ta liste avecla fonction 3
 

misfu a écrit :

PS : un prof nous a suggéré d'utiliser une Union, mais on comprend pas toutes suptilités de celles-ci.


Une union, pour résumer, c'est une variable pouvant être de plusieurs types
ex:  

union {
    char a;
    int b;
    double d;
} toto;


Tu peux mettre un char dans "toto.a", ou un "int" dans "toto.b" ou un double dans "toto.c" mais tu dois choisir. Tu ne peux pas avoir à la fois un char, un int et un double car la zone mémoire est la même pour les 3 membres. Cette zone est de la taille du membre le plus grand, à savoir un double dans cet exemple. De mon point de vue, cela sert très peu...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1395478
_darkalt3_
Proctopathe
Posté le 27-06-2006 à 09:16:31  profilanswer
 

Sve@r a écrit :

Faut bien que tu comprennes qu'une liste chaînée est un objet une structure


 [:aloy]

n°1395747
Trap D
Posté le 27-06-2006 à 14:49:15  profilanswer
 

_darkalt3_ a écrit :

Faut bien que tu comprennes qu'une liste chaînée est un objet une structure

Ben non, on manipule des objets qui ont une certaine structure il me semble, des structures simples comme des entiers ou des floats, plus élaborées comme les tableaux et enfin "compliquées" comme les structures de listes chaînées.


Message édité par Trap D le 27-06-2006 à 14:50:16
n°1395779
_darkalt3_
Proctopathe
Posté le 27-06-2006 à 15:24:28  profilanswer
 

Ben non, C n'est pas orienté objet [:spamafote]

n°1395782
skelter
Posté le 27-06-2006 à 15:27:53  profilanswer
 

_darkalt3_ a écrit :

Ben non, C n'est pas orienté objet [:spamafote]


 oui mais ne fait pas l'amalgame objet -> poo, et un langage peut ne pas etre orienté objet met quand meme offrir un support pour la poo

n°1395786
_darkalt3_
Proctopathe
Posté le 27-06-2006 à 15:32:35  profilanswer
 

comme par exemple :??:

n°1395810
Trap D
Posté le 27-06-2006 à 15:57:28  profilanswer
 

Pour moi le mot "structure" décrit l'organisation de l'entité, en C pour moi toujours, objet est équivalent à entité.

mood
Publicité
Posté le 27-06-2006 à 15:57:28  profilanswer
 

n°1395814
skelter
Posté le 27-06-2006 à 16:00:55  profilanswer
 

_darkalt3_ a écrit :

comme par exemple :??:


 
ben le c++ par exemple, dans la mesure ou il propose plusieurs paradigmes de programmation dont le paradigme oo mais ne l'impose pas
 
c'est aussi le cas de php, et de sans doute beaucoup d'autre langage


Message édité par skelter le 27-06-2006 à 16:01:41
n°1395823
_darkalt3_
Proctopathe
Posté le 27-06-2006 à 16:10:31  profilanswer
 

exact.
 
Quoi qu'il en soit, quand on déclare
 

Code :
  1. typedef struct s_Absences
  2. {
  3.    char Intitule[50] ;
  4.    int jour, mois, annee, heure, minute, points  ;
  5.    int justif ;
  6.    struct s_Absences * AbsenceSuivante ;
  7. }Absence;
  8. typedef struct s_Eleve
  9. {
  10.    char nom[20] ;
  11.    char prenom[20] ;
  12.    Absence * PremiereAbsence ;
  13.    struct s_Eleve * EleveSuivant ;
  14. }Eleve;


 
sémantiquement, on parle bien de structs, pas d'objets.
 
Je ne voulais pas qu'on mélange les choses.

n°1395843
Sve@r
Posté le 27-06-2006 à 16:27:19  profilanswer
 

_darkalt3_ a écrit :

Je ne voulais pas qu'on mélange les choses.


J'ai dit "objet" dans un cadre généraliste et schématique adapté au niveau de l'auteur (sans vouloir le critiquer car on a tous été débutants un jour).
J'aurais pu aussi dire "ensemble" ou un autre synonyme.  Je voulais juste essayer de schématiser la notion de "liste chaînée" mais je ne voulais pas parler d'objet tels qu'on les voit en C++ ou autres.
Bon, on va pas couper les cheveux de Lex Luthor en 4, ce n'est pas le sujet du topic...


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

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

  Enregistrement liste chaînée sur .bin

 

Sujets relatifs
[RESOLU] afficher une liste sauf unImages dans une liste deroulante est ce possible ?!?
Test sur liste deroulante qui bug !Liste chainée
[Résolu]Récupérer l'id du dernier enregistrement d'une table MySqlRemplir inputs via une liste deroulante(select)
Composant pour afficher une liste de fichiersAvoir les énoncés d'une liste en gras
table non basée,blocage sur enregistrement de doublons 
Plus de sujets relatifs à : Enregistrement liste chaînée sur .bin


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