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 :
Et :
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;
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 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;
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 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"); } }
Le compilateur m'indique un problème lors du chargement, à la ligne ou je fais le realloc.
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; } }
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.
Partager