Je teste une structure personnalisée où il y a un champ de bits et un char * non signé (qui sera alloué plus tard).fwrite/fread struct avec bitfields et char *
Voici la structure:
struct test {
unsigned int field1 : 1;
unsigned int field2 : 15;
unsigned int field3 : 32;
unsigned int dataLength : 16;
unsigned char * data;
}
Le problème est quand j'ai essayé de sauver ce struct dans un fichier en hexadécimal.
Par exemple:
int writeStruct(struct test *ptr, FILE *f) {
// for data, suppose I know the length by dataLength :
// this throw me : cannot take adress of bit field
int count;
count = fwrite(&(ptr->field2), sizeof(unsigned int), 1, f);
// this throw me : makes pointer to integer without a cast
count = fwrite(ptr->field2, sizeof(unsigned int), 1, f);
// same for length
count = fwrite(htons(ptr->data) , ptr->dataLength, 1,f);
// so , how to do that ?
}
Le même problème va fread:
int readAnStructFromFile(struct test *ptr, FILE *f) {
// probably wrong
fread(ptr->field1, sizeof(unsigned int), 1, f);
}
Alors, comment puis-je écrire/lire struct comme ça?
Merci pour votre aide
PS pour fread, cela pourrait fonctionner s'il n'y avait pas ces bitfields: How to fread() structs?
Lors de l'utilisation bitfields pour '' field1' et field2' semble logique, car ils ne sont pas bits standard -widths, cela a moins de sens pour 'field3' et' dataLenght', qui pourraient utiliser respectivement 'uint32_t' et' uint16_t'. Et si vous n'êtes pas sur un système contraint en mémoire, il n'y a souvent pas besoin de bitfields (et utilisez ensuite size_t) pour le membre 'dataLength') sauf si vous essayez de faire correspondre une autre structure de données (paquet réseau, structure sur disque, ou similaire). –
C'est un exemple pour gérer plusieurs cas :). J'ai essayé de faire un paquet réseau personnalisé ^^ – jy95
Avez-vous vraiment besoin de stocker le fichier au format binaire? Pourquoi pas quelque chose comme 'json', etc.? Ce qui serait plus facile à lire en raison de la structure de texte de fichier cohérente en utilisant 'fscanf' et' fprintf'. – AmeyaVS