Pour enregistrer une liste chainée dans un fichier, tu dois parcourir la liste j'usqu'au dernier élément en enregistrant l'élément sur lequel tu te déplace dans le fichier. Et en effet, le pointeur n'a pas lieu d'etre sauvegardé car il n'a plus aucun sens quand on recharge les données. On peut donc écrire
#include <stdio.h>
#include <stdlib.h>
struct bibli
{
int numero;
int volume;
char titre[20];
char auteur[20];
char edition[10];
char date[7];
int suppr;
};
struct elementBibli{
struct bibli data;
struct elementBibli *pSuiv; /* <= pointe sur l'element
* de la liste suivante
* == NULL si fin de liste */
};
void enregistre( struct elementBibli* e, FILE* fic ){
while( e != NULL ){
fwrite( &(e->data), sizeof(e->data),1, fic );
e = e->pSuiv;
}
}
/*
Pour recharger, il faut reconstruire la liste chainée
*/
struct elementBibli* recharge( FILE* fic ){
struct elementBibli *courant = (struct elementBibli *)malloc( sizeof(elementBibli) );
struct elementBibli *suivant, *tete;
int lu;
/* Lecture du premier element */
if( fread( &(courant->data), sizeof(courant->data), 1, fic ) != 1 ){
/* Echec */
free( courant );
return NULL;
}
courant->pSuiv = NULL;
tete = courant;
do{
suivant = (struct elementBibli *)malloc( sizeof(elementBibli) );
lu=fread( &(suivant->data), sizeof(suivant->data), 1, fic );
if( lu == 1 ){
/* Lecture bien passée */
courant->pSuiv = suivant;
suivant->pSuiv = NULL;
courant = suivant;
}
}while( lu == 1 );
free( suivant );
return tete;
}
struct elementBibli* createList(){
int i;
struct elementBibli* tete;
struct elementBibli* courant = (struct elementBibli*) malloc(sizeof(struct elementBibli));
struct elementBibli* suivant;
tete = courant;
courant->data.numero = 0;
for( i=1; i<10; i++){
suivant = (struct elementBibli*) malloc(sizeof(struct elementBibli));
suivant->data.numero = i;
courant->pSuiv = suivant;
courant = suivant;
}
suivant->pSuiv = NULL;
return tete;
}
void affList(struct elementBibli* e){
if( !e ){ printf( "List vide !!\n" ) ;return; }
printf( "Numero - " );
while( e != NULL ){
printf( "%d - ", e->data.numero);
e = e->pSuiv;
}
printf( "fin list\n" );
}
void destruitList(struct elementBibli* e){
struct elementBibli *courant, *temp;
courant = e;
while( courant != NULL ){
temp = courant->pSuiv;
free( courant );
courant = temp;
}
}
void main(){
FILE* fic;
struct elementBibli *list1, *list2;
list1 = createList();
printf(" Enregistrement dans fichier de la liste 1 : \n" ) ;
affList( list1 );
fic = fopen( "toto.dat", "w" );
enregistre( list1, fic );
fclose( fic );
printf("\n\n Recharche du fichier dans la liste 2 : \n" ) ;
fic = fopen( "toto.dat", "r" );
list2 = recharge( fic );
affList( list2 );
/* Ferme le fichier, libere la mémoire */
fclose( fic );
destruitList( list1 );
destruitList( list2 );
}