Lecture en mode binaire d'un tableau

Fermé
DABO03 Messages postés 9 Date d'inscription lundi 14 janvier 2013 Statut Membre Dernière intervention 23 janvier 2013 - 14 janv. 2013 à 18:53
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 24 janv. 2013 à 10:30
Bonsoir. Je suis entrain de réaliser une fiche étudiant. Je suis parvenu à écrire dans un fichier le tableau de structure mais quand je veux le récupérer dans un autre tableau pour le traitement, les informations ne sont pas complètes. Merci d'avance



//Ci-dessous la procédure qui permet de recueillir les informations entrées par l'utilisateur
int input(Eleve eleve[])
{
int i = 0, choice = 0;
do{
if(choice == 2)
break;
system("cls");
printf("ETUDIANT %d\n\n", i+1);

printf(" SECTION A \n");
printf("INFORMATIONS PERSONNELLES\n\n");

printf("Nom\n\n");
fflush(stdin);
fgets(eleve[i].nom, sizeof eleve[i].nom, stdin);
search(eleve[i].nom);
/* ............................................
..................................*/
system("cls");

i++;

do{
printf("\n\nCONTINUER LA SAISIE ====> 1\n");
printf("QUITTER LA FENETRE DE SAISIE ====> 2\n\n");
receive(&choice);
}while(choice != 1 && choice != 2);

}while(choice == 1);

FILE *fichier = fopen("base.bin", "ab");
if(fichier == NULL)
exit(EXIT_FAILURE);

fwrite(eleve, i*sizeof(eleve), 1, fichier);
fclose(fichier);

system("cls");

return i;
}

//Ci-dessous la procédure qui permet de recueillir les informations contenues dans le fichier externe
void output(Eleve eleve[], int n)
{
FILE *fichier = fopen("base.bin", "rb");
if(fichier == NULL)
exit(EXIT_FAILURE);

fread(eleve, n * sizeof(eleve), 1, fichier);
printf("%s %s a %d ans\n", eleve[0].nom, eleve[0].prenom, eleve[0].age);//Cette ligne me permet de voir le résultat de la lecture et c'est elle qui m'indique qu'il y a un problème puisque seuls les 4 premiers caractères du nom sont affichés.
fclose(fichier);
system("PAUSE");
}
A voir également:

3 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
14 janv. 2013 à 19:21
Salut DABO03,

Ton typedef Eleve, il ressemble à quoi ?


Dal
1
DABO03 Messages postés 9 Date d'inscription lundi 14 janvier 2013 Statut Membre Dernière intervention 23 janvier 2013
Modifié par DABO03 le 15/01/2013 à 12:52
Salut Dal, je m'excuse pour le retard. J'avais cru avoir résolu mon problème. En fait je souhaite mettre à la disposition de l'utilisateur une base de données (contenant les informations enregistrées pour les premiers étudiants). La base doit également etre modifiable.

//Voici ma structure Eleve
typedef struct Eleve Eleve;
struct Eleve
{
char nom[30];
char prenom[30];
int age;
int sexe;
int nationalite;
int filiere;
/* ...............
.............*/

};
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié par [Dal] le 16/01/2013 à 15:13
Salut DABO03,

Si tu veux pouvoir modifier le contenu d'un fichier binaire contenant les données issues de ta structure de données, j'imagine que tu as par exemple les solutions suivantes :

1- charger en mémoire vive toutes les données du fichier, modifier celles qui doivent l'être en mémoire vive, re-sauvegarder l'intégralité en écrasant l'ancien fichier,

2- déterminer un moyen de naviguer dans le flux du fichier, en créant un index, en classant les noms par ordre alphabétique, etc.(mais un identifiant du type n° d'étudiant dans un index est mieux pour gérer les homonymies, et distinguer facilement un enregistrement unique d'un autre), te permettant de naviguer directement à l'emplacement à charger, et/ou à l'emplacement à modifier (ouverture du fichier en lecture / écriture). Tu navigues dans le flux du fichier ouvert avec fseek.

La 2ème solution est plus complexe, mais se rapproche plus de la création d'un SGBD et évite des opérations consommatrices de mémoire et d'accès au disque lorsque les données à manipuler sont lourdes.

Il te faudra concevoir cette structure aussi en tenant compte des types d'interrogations que tu vas faire : par numéro, par nom, etc., pour créer et maintenir, éventuellement, des index pour ces cas, et avoir aussi un moyen de recherche dans le cas où aucun index n'est préconstitué (avec une recherche forcément plus lente).


Dal
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
16 janv. 2013 à 15:16
Stp, évite les "..........." pour faire remonter ton post. Cela pollue le thread.
0
DABO03 Messages postés 9 Date d'inscription lundi 14 janvier 2013 Statut Membre Dernière intervention 23 janvier 2013
23 janv. 2013 à 13:36
SALUT DAL
Merci encore pour votre aide. Je pense que la deuxième solution est plus adaptée à mon problème. J'avait renoncer à utiliser les listes chaînées pour ne pas avoir à faire une sérialisation mais même si je dispose d'un identifiant, je ne sais pas comment m'y prendre pour mettre à jour la BD (enregistrer dans le fichier une nouvelle structure Etudiant chaque fois qu'un utilisateur fait entrer ses données).
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié par [Dal] le 24/01/2013 à 10:32
En supposant que l'index et le fichier de données soient deux fichiers séparés.

Pour ajouter : tu ouvres le fichier en écriture, tu ouvres l'index en écriture, tu ajoutes aux deux. Tu fermes. S'agissant de l'index, tu classeras la nouvelle entrée dans l'index en fonction du critère d'indexation. Pour l'index, tu pourras le faire en le chargeant entièrement en mémoire.

Pour modifier : tu ouvres le fichier en écriture, tu ouvres l'index en lecture, tu te déplaces avec fseek à l'emplacement où ton index te dis que sont les données à mettre à jour, et tu écris les données qui remplacent les précédentes. Chaque "fiche" étudiant a la même taille et tu connais la structure de ton fichier, puisque c'est toi qui décide de sa structure. Tu fermes.

Tu dois aussi réfléchir à ta structure de fichier (et de données), afin de pouvoir faire des opérations de retrait aussi. Un index sous la forme d'une liste chaînée n'est pas une mauvaise idée de ce point de vue là.

Voir aussi les remarques précédentes sur les types d'interrogations, qui ont aussi un impact sur la conception des indexs.

Vois cette discussion sur SO :

https://stackoverflow.com/questions/1108/how-does-database-indexing-work


Dal
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
14 janv. 2013 à 20:13
Bonjour,
fflush(stdin); à ne jamais utiliser. Il faut vider le buffer explicitement.

fwrite(eleve, i*sizeof(eleve), 1, fichier);
Plutôt : fwrite (eleve, i*sizeof(Eleve), 1, fichier);
eleve et Eleve ne sont pas du tout la même chose.

Et pourrais-tu nous donner la définition de la structure Eleve ?
1
DABO03 Messages postés 9 Date d'inscription lundi 14 janvier 2013 Statut Membre Dernière intervention 23 janvier 2013
14 janv. 2013 à 20:37
Merci pour vos interventions mais j'ai réussi la lecture en utilisant un pointeur sur la structure plutot que le tableau. Cependant je ne comprends pas ce que vous entendez par "vider le buffer explicitement. "
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
14 janv. 2013 à 21:02
Le pointeur sur la structure peut fonctionner, mais reste à voir comment tu l'as implémenté.
Pour vider le buffer :
char *ret = fgets(eleve[i].nom, ...);
if (ret != NULL) {
    char *p = strchr(eleve[i].nom, '\n');
    if (p == NULL) {
          int c;
          while ( ( c = getchar () ) != '\n' && c != EOF );
    }
          *p = '\0'; /*à mettre si tu souhaites enlever le '\n' dans ta chaîne*/
    }
}

Je te conseille bien sûr, de faire une fonction.
0
DABO03 Messages postés 9 Date d'inscription lundi 14 janvier 2013 Statut Membre Dernière intervention 23 janvier 2013
15 janv. 2013 à 12:41
Bonjour.
Merci beaucoup mais contrairement à ce que je pensais, mon probleme est loin d'etre resolu.
Enfait, je voudrait faire des mise à jours de mon tableau et non des écritures simples de sorte que à chaque fois que j'écris, la nouvelle entrée se positionne à la suite du précédent. J'aimerai savoir s'il est possible de mettre à jour le tableau d'étudiants qui figure dans le fichier. Sinon pourriez-vous m'indiquer une alternative pour le stockage de mes informations svp?

typedef struct Eleve Eleve;
struct Eleve
{
char nom[30];
char prenom[30];
int age;
int sexe;
int nationalite;
int filiere;
/* ...............
.............*/

};
0
DABO03 Messages postés 9 Date d'inscription lundi 14 janvier 2013 Statut Membre Dernière intervention 23 janvier 2013
14 janv. 2013 à 19:09
...................
0