En C, vous devrez coder une fonction pour le faire pour vous. Vous ne pouvez pas simplement blatir la structure sur le disque car b
est un pointeur qui n'a aucun sens sans la chaîne de sauvegarde. Et, à moins que vous sachiez (et pouvez contrôler) comment votre compilateur conditionne ses structures, vous êtes mieux avec une fonction utilitaire de toute façon, même sans pointeurs. Et, comme si cela ne suffisait pas, vous devriez également afficher la longueur de la chaîne afin de connaître le nombre d'octets à lire.
Vous allez chercher quelque chose comme:
int better_than_blat (FILE *f, struct a *x) {
size_t len = strlen (x->b);
if (fwrite (&(x->a), sizeof(long), 1, f) != 1) return -1;
if (fwrite (&len, sizeof(size_t), 1, f) != 1) return -1;
if (fwrite (x->b, len, 1, f) != 1) return -1;
if (fwrite (&(x->c), sizeof(short), 1, f) != 1) return -1;
return 0;
}
int better_than_unblat (FILE *f, struct a *x) {
size_t len;
if (fread (&(x->a), sizeof(long), 1, f) != 1) return -1;
if (fread (&len, sizeof(size_t), 1, f) != 1) return -1;
x->b = malloc (len + 1);
if (x->b == NULL) return -1;
memset (x->b, 0, len + 1);
if (fread (x->b, len, 1, f) != 1) return -1;
if (fread (&(x->c), sizeof(short), 1, f) != 1) return -1;
return 0;
}
Voulez-vous court à stocker en 8 octets ou 4? – Patrick
Pouvez-vous garantir qu'un long et un court sont de la même taille? Ou voulez-vous qu'ils soient écrits et lus comme valeurs de 4 octets quel que soit le type? –
Patrick, "Vulcan Eager", j'ai fait une petite erreur avec l'exemple de sortie. Corrigé cela, ainsi que changé les types de '.a' et' .c' aux types de bits fixes. –