Lecture de structures en C++ ? Nouvelles questions > [C/C++] - C++ - Programmation
Marsh Posté le 16-02-2005 à 21:12:22
tu peux la jouer avec fread(), tout betement
Code :
|
cela dit perso je serais plus pour une lecture "membre par membre".
Marsh Posté le 16-02-2005 à 21:20:30
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
Marsh Posté le 16-02-2005 à 21:34:05
kowalski a écrit : Je viens de poster un truc ridicule |
de facon aussi 'crue' non, pas a ma connaissance (pas de maniere sure, en tout cas)
Marsh Posté le 16-02-2005 à 21:45:36
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 :
|
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
Marsh Posté le 16-02-2005 à 22:06:27
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
Marsh Posté le 16-02-2005 à 22:16:09
bin le fread/fwrite devrait rouler (meme si c'est pas le plus elegant)
Marsh Posté le 23-02-2005 à 14:24:14
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
Marsh Posté le 23-02-2005 à 14:25:44
bin non, tu peux faire un vieux memcpy de bourrinos. (je suppose que tu recois tes données dans un tableau ?)
Marsh Posté le 23-02-2005 à 14:30:10
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)
Marsh Posté le 23-02-2005 à 14:30:45
ok tu me conseilles de passer par des fichiers temporaires plutot que par memcpy quoi
Marsh Posté le 23-02-2005 à 14:34:02
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)
Marsh Posté le 23-02-2005 à 14:39:48
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)
Marsh Posté le 23-02-2005 à 14:42:50
Ah bin effectivement, si tu fais un #pragma pack(1) t'auras pas de decallage
Marsh Posté le 23-02-2005 à 15:43:03
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.
Marsh Posté le 16-02-2005 à 21:10:10
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