Enregistrement liste chaînée sur .bin

Enregistrement liste chaînée sur .bin - C - Programmation

Marsh Posté le 26-06-2006 à 15:14:30    

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.

Reply

Marsh Posté le 26-06-2006 à 15:14:30   

Reply

Marsh Posté le 26-06-2006 à 16:24:36    

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

Reply

Marsh Posté le 26-06-2006 à 23:24:16    

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
Reply

Marsh Posté le 26-06-2006 à 23:28:20    

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

Marsh Posté le 27-06-2006 à 09:16:31    

Sve@r a écrit :

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


 [:aloy]

Reply

Marsh Posté le 27-06-2006 à 14:49:15    

_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
Reply

Marsh Posté le 27-06-2006 à 15:24:28    

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

Reply

Marsh Posté le 27-06-2006 à 15:27:53    

_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

Reply

Marsh Posté le 27-06-2006 à 15:32:35    

comme par exemple :??:

Reply

Marsh Posté le 27-06-2006 à 15:57:28    

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

Reply

Marsh Posté le 27-06-2006 à 15:57:28   

Reply

Marsh Posté le 27-06-2006 à 16:00:55    

_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
Reply

Marsh Posté le 27-06-2006 à 16:10:31    

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.

Reply

Marsh Posté le 27-06-2006 à 16:27:19    

_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.
Reply

Sujets relatifs:

Leave a Replay

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