Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2947 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C/C++] Lecture de structures en C++ ? Nouvelles questions >

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C/C++] Lecture de structures en C++ ? Nouvelles questions >

n°983984
kowalski
Posté le 16-02-2005 à 21:10:10  profilanswer
 

Sauriez vous m'aider à trouver une méthode ou une fonction permettant simplement de faire une lecture "en bloc" d'une structure ? Dans un fichier ou dans une variable, on a, par exemple :
 
PierreJacques1999
 
or, on a une structure qui comporte la meme taille au total (sizeof(mastruct)) En sachant que le string qui doit accueillir Pierre fait TOUJOURS 6 lettres, etc. Il n'a pas à détecter qu'il doit passer d'un champ à un autre, c'est tjs les memes tailles
J'aimerais à partir d'un fichier ou au clavier remplir tous les champs de ma struct. (Readblock en Pascal) j'aimerais également faire l'inverse, c'est à dire WriteBlock
 
A l'aide ! (j'essaie d'etre clair mais ouuuuuh que ce n'est pas gagné!)


Message édité par kowalski le 23-02-2005 à 14:25:43
mood
Publicité
Posté le 16-02-2005 à 21:10:10  profilanswer
 

n°983985
chrisbk
-
Posté le 16-02-2005 à 21:12:22  profilanswer
 

tu peux la jouer avec fread(), tout betement

Code :
  1. struct MaStruct machin;
  2. FILE * toto = fopen(...);
  3. fwrite(&machin, sizeof(struct MaStruct), 1, toto);
  4. fread(&machin, sizeof(struct MaStruct), 1, toto);


 
 
cela dit perso je serais plus pour une lecture "membre par membre".


Message édité par chrisbk le 16-02-2005 à 21:12:50
n°984003
kowalski
Posté le 16-02-2005 à 21:20:30  profilanswer
 

Je viens de poster un truc ridicule
je recommence,
dans le cas admettons d'un  
 
unsigned short buffer[100];
Avec que des short à l'intérieur, que j'aimerais balancer méchamment dans une structure, c'est jouable ?
 
exemple le premier champ est un long premier_champ
buffer[0] = 0x11
buffer[1] = 0xE2
donc premier_champ deviendra 0x11E2
 
Boudiou que je suis nul quand j'essaie d'expliquer un truc

n°984009
kowalski
Posté le 16-02-2005 à 21:21:42  profilanswer
 

fread je testerais demain :)

n°984028
chrisbk
-
Posté le 16-02-2005 à 21:34:05  profilanswer
 

kowalski a écrit :

Je viens de poster un truc ridicule
je recommence,
dans le cas admettons d'un  
 
unsigned short buffer[100];
Avec que des short à l'intérieur, que j'aimerais balancer méchamment dans une structure, c'est jouable ?
 
exemple le premier champ est un long premier_champ
buffer[0] = 0x11
buffer[1] = 0xE2
donc premier_champ deviendra 0x11E2
 
Boudiou que je suis nul quand j'essaie d'expliquer un truc


 
 
de facon aussi 'crue' non, pas a ma connaissance (pas de maniere sure, en tout cas)

n°984040
kowalski
Posté le 16-02-2005 à 21:42:22  profilanswer
 

Tu sais ce que donne fread dans des bibliothèques C++ ?

n°984048
chrisbk
-
Posté le 16-02-2005 à 21:45:36  profilanswer
 

Ca risque pas d'etre mieux (c++ etant un poil plus haut niveau, ce genre de manip douteuse risque pas d'etre prévue..)
 
bon, ok, si je pense y'a une maniere sure, mais ca dependra du compilo
 

Code :
  1. #pragma pack(1) //on aligne sur 1 octet les membres (donc on aligne rien, en fait)
  2. typedef struct bidule{
  3.   unsigned short roger;
  4.   unsigned short paul;
  5. }bidule;
  6. #pragma pack() //on remet l'alignement par defaut
  7. ...
  8. bidule machin;
  9. memcpy(&machin, monBuffer, sizeof(bidule));
  10. //lire dans machin


 
la directive #pragma pack() existe sous VS6 et superieur, sur d'autre compilo je sais pas (le but est d'etre sur que le compilo ne va pas proceder a un realignement des membres de la structure)
 
 
pourquoi tu veux faire ca ? y'a surement plus simple


Message édité par chrisbk le 16-02-2005 à 21:47:13
n°984101
kowalski
Posté le 16-02-2005 à 22:06:27  profilanswer
 

Parce que j'ai de grosses structures de données en entrées et en sortie
J'aimerais soit le remplir au fur et à mesure à la main, soit par le biais d'un fichier
 
J'avais surtout l'habitude de fire ca en Pascal quand je faisais du traitement d'image, je trouvais ca incroyablement génial :)
 
PS : désolé pr le retard j'étais au tel

n°984125
chrisbk
-
Posté le 16-02-2005 à 22:16:09  profilanswer
 

bin le fread/fwrite devrait rouler (meme si c'est pas le plus elegant)

n°991228
kowalski
Posté le 23-02-2005 à 14:24:14  profilanswer
 

Après avoir bien avancé (grâce à vous pour certains points),
posons le cas suivant :
 
Je récupère par le biais d'un port un buffer de données genre 200 mots de 16 bits chacuns.
Si je veux l'intégrer dans ma structure de données (types différents, mais dans le meme ordrer que le buffer et faisant pile poal 400 octets, ai-je une autre solution que de copier le buffer dans un fichier et faire un fread ? (j'imagine que oui c'est pour cela que je pose la question...
 
Et deuxième question, fread fait probablement partie de la syntaxe des flux fichiers de C, y-a-il un équivalent pour fstream de C++ ?
 
merci à tous


Message édité par kowalski le 23-02-2005 à 14:25:03
mood
Publicité
Posté le 23-02-2005 à 14:24:14  profilanswer
 

n°991232
chrisbk
-
Posté le 23-02-2005 à 14:25:44  profilanswer
 

bin non, tu peux faire un vieux memcpy de bourrinos. (je suppose que tu recois tes données dans un tableau ?)

n°991237
chrisbk
-
Posté le 23-02-2005 à 14:27:12  profilanswer
 

(cela dit je déconseille ce genre de pratique guerriere)

n°991238
kowalski
Posté le 23-02-2005 à 14:30:10  profilanswer
 

Bon, j'me débrouille, j'adore me trimbaler dans les structures avec mon arithmétique de pointeurs t'facon :)
 
(en fait ce qui m'énerverait ca serait découvrir une bibli ou une fonction une fois que j'aurais codé la méthode bourrinos)

n°991239
kowalski
Posté le 23-02-2005 à 14:30:45  profilanswer
 

ok tu me conseilles de passer par des fichiers temporaires plutot que par memcpy quoi

n°991247
chrisbk
-
Posté le 23-02-2005 à 14:34:02  profilanswer
 

kowalski a écrit :

ok tu me conseilles de passer par des fichiers temporaires plutot que par memcpy quoi


 
 
Non.
 
le probleme est le suivant : Si tu sauvegardes une struct au fwrite et que tu la recharge au fread, a priori, pas de probleme. Le pb c'est que comme je le sens, t'as un gros tableau et tu veux faire entrer ce tableau dans une structure. Si la structure a exactement la meme taille que le tableau, ok, ca roule, sinon j'ai peur (tu te rapelles mes histoires d'alignement ? bin voila pourquoi j'ai peur. Y'a possibilité que tu ecrives des elements du tableau dans les octets de padding). Que tu passes par un fichier temporaire ou par un fwrite du tableau / fread dans la struct, mes craintes seront les memes (et le fwrite/fread ca serait tout laid, quitte a faire agresse ca au memcpy)

n°991259
kowalski
Posté le 23-02-2005 à 14:39:48  profilanswer
 

Les pragma marchent très bien pour le reste (navigation dans les strucs), donc et là les premiers tests montre que par fread fwrite, ca passe assez bien...
Je vais continuer comme ca en attendant, ca ne sera qu'une fonction à modifier au pire, c'est bloquant pour moi à ce stade, donc il faut que je passe outre et si le forum a une idée de génie d'ici là, bah je changerais...
 
de buffer tableau à struct ca passe "plutot" bien, (enfin sur des cas de 200 mots je n'ai pas vu de décallage)

n°991268
chrisbk
-
Posté le 23-02-2005 à 14:42:50  profilanswer
 

Ah bin effectivement, si tu fais un #pragma pack(1) t'auras pas de decallage
 
 
 

n°991383
gzii
court-circuit
Posté le 23-02-2005 à 15:43:03  profilanswer
 

Si tu remplaces ta structure par une classe (c++),
tu peux implémenter Serialize pour enregistrer ou recharger les données sur disque,
et aussi les opérateurs "<<", ">>" ou "=" (operator<<, operator>> et operator= il me semble ?),
et même faire un constructeur de copie.
 
Avec ça ça devrait te laisser pas mal de choix.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C/C++] Lecture de structures en C++ ? Nouvelles questions >

 

Sujets relatifs
Classe Lecturelecture fichier en hexa??
[Projet jeu JAVA] Questions de débutanterreur de lecture dans un fichier
Lecture de fichierlecture d'un fichier volumineux
Questions sur XML / DocBookLecture en VB d'un fichier cree en C
Questions PHP/MYSQL sur les TEXTAREARedirection des I/O et lecture du clavier
Plus de sujets relatifs à : [C/C++] Lecture de structures en C++ ? Nouvelles questions >


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR