IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Stocker dans fichier des listes chainées


Sujet :

C

  1. #1
    Membre du Club Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 67
    Points
    67
    Par défaut Stocker dans fichier des listes chainées
    Bonjour ...

    Je voulais stocker dans un fichier une structure de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    typedef struct{
    	SActivite *Scientifique;
    	CActivite *Culturelle;
    }Activite;
    Et voilà les structures de ses deux champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
    typedef struct CA{
    	int code;
    	char nom[20];
    	char libelle[150];
    	Duree *duree;
    	int Nb_Max;
    	struct CA *Suivant;
    }CActivite;
     
     
    typedef struct SA{
    	int code;
    	char nom[20];
    	char libelle[150];
    	Duree *duree;
    	struct SA *Suivant;
    }SActivite;
    Et chacune de ses deux dernières structures, elles ont un champs de type pointeur vers Duree, et voilà sa structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    typedef struct{
    	int jour;
    	int mois;
    	int annee;
    }Date;
     
    typedef struct{
    	Date *debut;
    	Date *fin;
    }Duree;

    Le problème :

    quand je sauvgarde la structure globale "Activite" dans un fichier, ça marche.
    quand je veux alimenter une liste de type "Activite" (on la note A1) depuis ce fichier,ça marche partiellement. Je m'explique :
    quand je veux afficher n'importe quelle champs qui est déclaré comme étant static : par exemple je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    A1->Culturelle->nom  (ça marche)
    A1->Culturelle->code (ça marche)
    ....
    Mais dès que je fasse :
    A1->Culturelle->duree (le programme se bolque)

    Donc ce que j'ai constaté qu'on doit déclarer les champs de nos structures comme étant des statique (y a pas pointeur) pour qu'on puisse les stocker et les réccupere.

    Mais moi j'ai besoin vraiment de ce passage par pointeur.


    Pourriez vous m'aider ?


    Merciii

    Sisiniya

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct{
    	int jour;
    	int mois;
    	int annee;
    }t_date;
     
    typedef struct{
    	t_date debut;
    	t_date fin;
    }Duree;
     
    printf("%d", A1->Culturelle->Duree->debut.jour);
    Ou alors, si tu laisses debut et fin en tant que pointeurs, faut pas oublier de les allouer (et pareil pour Duree). Ceci dit, personne ne comprend pourquoi cela doit forcément en être ainsi...

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Les pointeurs ne sont pas des données immuables dans un programme et peuvent changer d'une exécution à l'autre, puisqu'ils représentent l'adresse d'autres données.
    Il ne faut donc pas sauvegarder les pointeurs, mais l'information dont ils représentent l'adresse. Dans ton exemple, si on sauve un CActivite, CA, on doit sauver CA.code, CA.nom, CA.libelle, CA.duree->debut->jour, CA.duree->debut->mois,... Réservons pour l'instant la question de CA.Suivant.

    Maintenant, il n'y a pas de raison logique à mon sens d'allouer dynamiquement le champ duree qui correspond à des données de taille fixée. Cela alourdit le code et augmente la taille mémoire utilisée. Pourquoi pas simplement en conservant la structuration des données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct{
    	Date debut;
    	Date fin;
    }Duree; 
    typedef struct CA{
    	int code;
    	char nom[20];
    	char libelle[150];
    	Duree duree;
    	int Nb_Max;
    	struct CA *Suivant;
    }CActivite;
    Reste le cas du champ Suivant à considérer si on sauve une liste de CActivite. On doit sauvegarder l'information : "Qui est le suivant en mémoire" en codant dans le fichier "Où est le suivant sur le fichier" ? Ce codage dépend du format d'écriture de tes données (binaire ou texte), si les enregistrements sont de taille fixe ou variable,...

    Lors de la lecture du fichier, il va falloir reconstituer la liste à partir de ces informations : ce qui est en allocation dynamique dans la structure doit être réalloué et l'information correspondante dans le fichier copiée dans la mémoire allouée. Le chainage entre structure doit être reconstitué pour former une nouvelle liste. (Donner une attention particulière aux fonctions d'allocation/initialisation des structures et d'insertion dans la liste déjà utilisées pour créer/éditer la liste si on veut pouvoir les réutiliser et ne pas écrire plusieurs fois le même code)

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    Reste le cas du champ Suivant à considérer si on sauve une liste de CActivite. On doit sauvegarder l'information : "Qui est le suivant en mémoire" en codant dans le fichier "Où est le suivant sur le fichier" ? Ce codage dépend du format d'écriture de tes données (binaire ou texte), si les enregistrements sont de taille fixe ou variable,...
    On peut contourner le problème en stockant les infos dans le fichier dans l'ordre logique de la liste.
    Au rechargement, suffit de lire le fichier et appeler la fonction "insereElement()" pour chaque élément du fichier ce qui recalcera la liste dans l'ordre d'origine.

  5. #5
    Membre du Club Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 67
    Points
    67
    Par défaut
    Merci beaucoup pour vos réponses.

    Alors je crois que puisque l'erreur qui empêche ce stockage vient du faite que je dois mettre les champs de Duree et Date qui font partie de la structure SA et CA statique.

    Mais que vous dites par rapport a A1, qui contient elle aussi CA et SA qui sont déclarées comme dynamique. Autrement , est ce que ça ressemble pas au premier cas cité en haut.


    Je vous remercie pour votre participations.


    Sisiniya

  6. #6
    Membre du Club Avatar de sisiniya
    Inscrit en
    Décembre 2007
    Messages
    223
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 223
    Points : 67
    Points
    67
    Par défaut
    Aidez moi s'il vous plaît, vraiement j'ai besoin de votre soutient .


    Merci.


    Sisiniya

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Il me semble qu'on a répondu à ta question.

    Si il y a des choses que tu n'as pas comprises dans les réponses, pose des questions précises.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 396
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 396
    Points : 20 507
    Points
    20 507
    Par défaut
    Salut dans ton fichier pour enregistrer tes listes chainées il faut impérativement sauvegarder par la même occasion le nombre d'éléments de la liste.
    Par exemple si tu as 6 instances de CActivite et que tu écrives 6 x structures de CActivite comment veux-tu t'y retrouver à la lecture ?
    Comment sais-tu que tu devras réallouer 6 instances de CActivite ?
    Si tu lis et dépasses 6 alignements de structures tu vas lire n'importe quoi ou être en fin de fichier..
    Donc à la lecture tu lis d'abord le nombre n de type CActivite puis avec une boucle tu constitues ta liste chainée.
    Effectivement on ne peut pas écrire des pointeurs dans un fichier sinon c'est des plantages garantis

    Le code serait grossiérement ainsi ( à revérifier )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    typedef struct CA{
    	int code;
    	char nom[20];
    	char libelle[150];
    	Duree *duree;
    	int Nb_Max;
     
    }CActivite;
     
     
    typedef struct ListA
    {
    	CActivite *precedent;
    	CActivite *suivant;
     
    }
    ListeActivites;
     
    //lecture
    CActivite instanceActivite;
     
    long NbreActivites;
    ListeActivites lActivites;
    lActivites.precedent=NULL;
    lActivites.suivant=NULL;
    FILE *FichierSauvegarde=fopen("activites.bin","rb");
    fread(NbreActivites,sizeof(long),1,FichierSauvegarde);
    for( l=0;l<NbreActivites;l++)
    {	if( 	lActivites.precedent==NULL)
    	{
    		lActivites.suivant=lActivites.precedent=(CActivite)malloc(sizeof(CActivite));
    	}
    	else
    	{
    		lActivites.precedent=lActivites.suivant;
    		lActivites.suivant=(CActivite)malloc(sizeof(CActivite));
     
    	}
    	fread(instanceActivite,sizeof(CActivite),1,FichierSauvegarde);
    	memcpy(lActivites.precedent,instanceActivite,sizeof(CActivite));
     
    }

Discussions similaires

  1. fichier plus liste chainé
    Par Warfdog dans le forum Débuter
    Réponses: 2
    Dernier message: 18/11/2009, 15h25
  2. Réponses: 4
    Dernier message: 27/04/2009, 19h33
  3. Lecture d'un fichier et liste chainée
    Par étoile de mer dans le forum Débuter
    Réponses: 20
    Dernier message: 01/06/2008, 23h30
  4. fichier et liste chainée
    Par seifdev dans le forum C
    Réponses: 4
    Dernier message: 23/04/2007, 02h08
  5. Réponses: 3
    Dernier message: 30/03/2007, 18h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo