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 :

Problèmes enregistrement sur fichier .bin


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut Problèmes enregistrement sur fichier .bin
    Bonjour tout le monde !

    Me revoici de retour sur ces forums pour vous poser une nouvelle question, à laquelle je ne trouve pas de réponse ...
    J'ai deux structures imbriquées l'une dans l'autre, que je souhaite enregistrer sous format binaire.

    Voici mes deux structures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct{
        char nomClasse[MAX_CHAR];
        int nbEtu;
        int compteurMatricule;
        T_Etudiant * eleves;
    }T_Classe;
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef struct
    {
        char matricule[MAX_CHAR];
        char nom[MAX_CHAR];
        char prenom[MAX_CHAR];
        double tabCotes[5];
        double moyennePourcentage;
        char rue[MAX_CHAR];
        char ville[MAX_CHAR];
        int num;
        int cp;
    }T_Etudiant;
    Lorque je sauvegarde ces deux structures, j'utilise la méthode suivante : (2 fwrite de suite, car on ne peut pas écrire directement une structure en contenant une autre ...)
    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
    void sauvegarderClasse(T_Classe classe, char *nomSection, char *nomAnnee){
    	FILE *fichier;
    	char* url;
    	int nbEtu = classe.nbEtu;
    	url = malloc(MAX_CHAR * sizeof(char));//malloc de l'url
     
    	//Génération de l'url
    	sprintf(url, "%s%s.%s.%s.bin", URL_CLASSES ,nomSection, nomAnnee, classe.nomClasse);
    	if(DEBUG)
    		printf("\n\nURL : %s\n\n", url);
     
    	//Ouverture du fichier
    	fichier = fopen(url, "wb+");
    	if(fichier == NULL)
        {
    		printf("Erreur lors de l'ouverture de %s\n", url);
    		perror ("The following error occurred");
    		printf( "Value of errno: %d\n", errno );
    		exit(0);
    	}
     
    	/*Enregistrement dans le fichier*/
    	else
        {
    		fwrite(&classe, sizeof(T_Classe), 1, fichier);
    		fwrite(classe.eleves, nbEtu * sizeof(T_Etudiant), 1, fichier);
    		fclose(fichier);
    		printf("Fichier correctement enregistre !\n\n");
    		system("PAUSE");
    	}
    }
    Et lorsque que je les charge :
    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
    T_Classe chargerClasse(char *url, char* nomClasse){
    	FILE *fichier = NULL;
    	T_Classe returnClasse;
    	T_Classe *returnClasseVide = NULL;
    	int nbEtu;
     
    	fichier = fopen(url, "rb");
    	if(fichier == NULL)
        {
    		returnClasseVide = (T_Classe*) malloc(sizeof(T_Classe));
     
    		//Si le fichier de chargement de classe n'existe pas
    		//On crée une classe vide avec son nom et le nombre d'étudiant à 0.
    		strcpy(returnClasseVide->nomClasse, nomClasse);
    		returnClasseVide->nbEtu = 0;
     
    		printf("La classe \"%s\" est vide, vous devrez la remplir.", nomClasse);
    		return *returnClasseVide;
    	}
     
    	else
        {   //On lit d'abord la classe, comme cela on sait le nombre d'étudiants à mallocer.
            returnClasse.eleves = malloc(INCREMENTALLOC * sizeof(T_Etudiant));
     
    		fread(&returnClasse, sizeof(T_Classe), 1, fichier);
    		fread(returnClasse.eleves, returnClasse.nbEtu * sizeof(T_Etudiant), 1, fichier);
    		returnClasse.eleves = realloc(returnClasse.eleves, returnClasse.nbEtu * sizeof(T_Etudiant));
    		printf("Classe %s correctement chargee : ", returnClasse.nomClasse);
    		printf("il y a %d etudiants", returnClasse.nbEtu);
    		return returnClasse;
    	}
    }
    Le compilateur m'indique un problème lors du chargement, à la ligne ou je fais le realloc.
    Je ne comprends pas pourquoi ...

    Le code me semble pourtant plutôt correct ?

    Quelqu'un pourrait-il m'aider ?

    D'avance, merci à ceux qui prendront le temps de lire mon message.

    Une excellente journée,

    Mornor.

  2. #2
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Par défaut
    Bonjour
    As tu regardé ce que tu reçois dans returnClasse lors de la lecture?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Bonjour,

    Oui,

    En faisant comme cela :

    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
    void administrationClasse(char* nomClasse, char* nomSection, char* nomAnnee)
    {
    	int choix;
    	char* url;
    	T_Classe classe;
    	strcpy(classe.nomClasse, nomClasse);
    	/*O,n initialise le nombre d'étudiant à zero au début car on n'a pas encore lu la classe, qui est censée ne pas contenir d'étudiant pour le moment*/
    	classe.nbEtu = 0;
    	/*Malloc de départ*/
    	classe.eleves = malloc(INCREMENTALLOC * sizeof(T_Etudiant));
     
    	effacerEcran();
    	//Chargement du fichier de la classe SI existant
        url = malloc(MAX_CHAR * sizeof(char));
    	sprintf(url, "%s%s.%s.%s.bin", URL_CLASSES, nomSection, nomAnnee, nomClasse);
    	classe = chargerClasse(url, nomClasse); //Chargement de la classe
    	printf("%d", classe.nbEtu); system("pause");
    	effacerEcran(); 
    }
    Mais le problème est que je n'arrive même pas à cette étape là, étant donné que le programme "plante" (à l’exécution) lorsque je décide de charger la classe ...

    Edit, l'erreur vient du fread lors du chargment de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(returnClasse.eleves, returnClasse.nbEtu * sizeof(T_Etudiant), 1, fichier);

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Le problème pourrait-il venir de l'ordre des données lors de l'enregistrement ?

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    En fait le problème vient plus de ta compréhension de l'organisation de tes structures, enfin je pense.

    Ta première structure T_Classe contient un pointeur or ensuite tu l'utilises comme une membre flexible (cf le realloc) ce qui est incompatible.

    Pour sauver, il te faut 2 fwrite (1 seul suffirait dans si au lieu du pointeur tu utilisais un membre flexible) : le premier pour T_Classe et un autre pour le membre eleves qui je suppose pointe vers une zone mémoire contenant nbEtu structures de type T_Etudiant.
    Ensuite pour la lecture il te faudra 2 mallocs et 2 read. Le premier malloc alloue l'espace pour une structure de type T_Classe, ensuite un read pour la remplir. Un second malloc pour allouer l'espace qui sera pointé par le membre eleves, le remplissage avec un read. Et en dernier faire pointer le membre eleves au bon endroit.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 88
    Par défaut
    Bonjour,

    Un énorme merci pour votre réponse.

    Cependant, je ne comprend pas certaines choses :

    1. Vous dîtes que j'utilise le membres élèves comme étant libre. Je ne comprend pas car je ne déclare pas de membre élèves seul, mais juste une T_Classe (comprenant un pointeur vers élèves).

    2. J'ai fait comme vous avez dit pour le chargement (l'écriture en mémoire centrale), mais je ne vois pas comment mallocer une T_Classe, étant donné que celle ci est déclaré comme étant une variable, et non un pointeur ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    T_Classe chargerClasse(char *url, char* nomClasse)
    {
    T_Classe returnClasse;
     
            returnClasse = malloc(1 * sizeof(T_Classe));
    		fread(&returnClasse, sizeof(T_Classe), 1, fichier);
     
    		returnClasse.eleves = malloc(returnClasse.nbEtu * sizeof(T_Etudiant));
    		fread(returnClasse.eleves, returnClasse.nbEtu * sizeof(T_Etudiant), 1, fichier);
     
    		printf("Classe %s correctement chargee : ", returnClasse.nomClasse);
    		printf("il y a %d etudiants", returnClasse.nbEtu);
    		return returnClasse;
    }
    L'erreur se situe au niveau du malloc de returnClasse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème droits sur fichier samba
    Par Apprentilinux dans le forum Debian
    Réponses: 7
    Dernier message: 11/01/2008, 19h15
  2. invite d'ouverture ou d'enregistrement sur fichier
    Par Goldorak2 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/08/2007, 15h40
  3. invite d'ouverture ou d'enregistrement sur fichier
    Par Goldorak2 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 22/08/2007, 15h38
  4. Probléme Mystérieux sur Fichier
    Par DonFelipe dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 26/01/2007, 21h02
  5. [Rman]problème écriture sur fichier (linux)
    Par Invité dans le forum Oracle
    Réponses: 20
    Dernier message: 30/08/2006, 05h52

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