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
[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
A voir également:
- Lecture en mode binaire d'un tableau
- Tableau croisé dynamique - Guide
- Mode sécurisé samsung - Guide
- Tableau ascii - Guide
- Comment faire un tableau - Guide
- Mode d'emploi - Guide
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
14 janv. 2013 à 19:21
Salut DABO03,
Ton typedef Eleve, il ressemble à quoi ?
Dal
Ton typedef Eleve, il ressemble à quoi ?
Dal
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
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 ?
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 ?
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
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. "
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
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 :
Je te conseille bien sûr, de faire une fonction.
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.
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
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;
/* ...............
.............*/
};
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;
/* ...............
.............*/
};
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
14 janv. 2013 à 19:09
...................
Modifié par DABO03 le 15/01/2013 à 12:52
//Voici ma structure Eleve
typedef struct Eleve Eleve;
struct Eleve
{
char nom[30];
char prenom[30];
int age;
int sexe;
int nationalite;
int filiere;
/* ...............
.............*/
};
Modifié par [Dal] le 16/01/2013 à 15:13
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
16 janv. 2013 à 15:16
23 janv. 2013 à 13:36
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).
Modifié par [Dal] le 24/01/2013 à 10:32
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