В C вам придется написать функцию, которая сделает это за вас.Вы не можете просто записать структуру на диск, потому что b
- это указатель, который не имеет смысла без вспомогательной строки.И, если вы не знаете (и не можете контролировать), как ваш компилятор упаковывает свои структуры, вам все равно лучше использовать служебную функцию, даже без указателей.
И, как будто этого недостаточно, вам следуеттакже выведите длину строки, чтобы вы знали, сколько байтов нужно прочитать обратно.
Вы будете искать что-то вроде:
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;
}