En C, debe serializar las estructuras (convertirlas a una serie de bytes) manualmente. Si desea que la información que usted entregue sea legible por otra máquina, debe tomar la cuenta de endianness endianness.
Aquí está un ejemplo sencillo de la serialización de su estructura (escribirlo en un archivo), sin tener en cuenta endianness/diferencias de tamaño de palabra y hacer que el código no portables:
size_t length;
length = strlen(s->name) + 1;
fwrite(&length, sizeof(length), 1, fp);
fwrite(s->name, 1, length, fp);
length = strlen(s->surname) + 1;
fwrite(&length, sizeof(length), 1, fp);
fwrite(s->surname, 1, length, fp);
fwrite(&s->age, sizeof(s->age), 1, fp);
Y para unserialize:
size_t length;
fread(&length, sizeof(length), 1, fp);
s->name = malloc(length);
fread(s->name, 1, length, fp);
fread(&length, sizeof(length), 1, fp);
s->surname = malloc(length);
fread(s->surname, 1, length, fp);
fread(&s->age, sizeof(s->age), 1, fp);
En una aplicación real, debe verificar la validez de su entrada en lugar de asumir a ciegas que la entrada es válida y confiable. Además, debe decidir qué orden de bytes usará para almacenar sus int
s, size_t
s, etc., y asegúrese de leerlos/escribirlos en el orden de bytes correcto mediante el cambio de bit.
Por cierto, es posible que desee ver en tpl, un simple biblioteca de serialización binaria para C.
Esto no funcionará con la definición de estructura publicado - 'sizeof (s-> nombre)' dará la tamaño de un 'char *'. – caf
Sí, tienes razón - Cambié el tamaño de strlen –
así que ahora necesitas cambiarlo a strlen() * sizeof (char) ... (Bueno, sizeof (char) será 1, solo para el principio – rkellerm