2010-11-25 9 views
11

necesito para serializar un C struct a un archivo de una manera portátil, por lo que puedo leer el archivo en otras máquinas y se puede garantizar que voy a conseguir lo mismo que puse en.¿Qué es una forma portátil de escribir una estructura en un archivo en C?

El formato de archivo no importa, siempre que sea razonablemente compacto (escribir la representación en memoria de una estructura sería ideal si no fuera por los problemas de portabilidad).

¿Hay alguna forma limpia de lograr esto fácilmente?

Respuesta

15

Básicamente está diseñando un protocolo de red binario, por lo que es posible que desee utilizar una biblioteca existente (como los búferes de protocolo de Google). Si aún desea diseñar su propia, se puede lograr la portabilidad razonable de escritura estructuras primas al hacer esto:

  1. empacar sus estructuras (de GCC __attribute__((packed)), MSVC de #pragma pack). Esto es específico del compilador.
  2. Asegúrate de que tu número entero sea correcto (htons, htonl). Esto es específico de la arquitectura.
  3. No utilice punteros para cadenas (use memorias intermedias de caracteres).
  4. Use tamaños enteros exactos C99 (uint32_t etc.).
  5. Asegúrese de que el código solo compila donde CHAR_BIT es 8, que es el más común, o maneja la transformación de cadenas de caracteres a una secuencia de octetos de 8 bits. Hay algunos entornos donde CHAR_BIT! = 8, pero tienden a ser hardware de propósito especial.

Con esto usted puede estar razonablemente seguro de que obtendrá el mismo resultado en el otro extremo siempre que use la misma definición de estructura. Sin embargo, no estoy seguro acerca de la representación de los números de punto flotante, pero generalmente evito enviarlos.

Otro aspecto no relacionado con la portabilidad es la compatibilidad con versiones anteriores al introducir la longitud como primer campo y/o usar la etiqueta de versión.

+0

Es compatible con C++, no con C, pero aquí hay un enlace a la página de búferes de protocolo de Google: http://code.google.com/apis/protocolbuffers/ –

+0

Gracias - habiendo investigado un poco más en base a esta respuesta, también encontré los siguientes artículos sobre el código C portátil que pueden ser útiles para cualquier otra persona que encuentre esta pregunta: http://serghei.net/docs/programming/autobook-1.1/writing20portable20c.html y http://www.chris-lott.org /resources/cstyle/portableC.html – Justin

+0

@Alex Reynolds realmente? Este parece bastante activo. http://code.google.com/p/protobuf-c/ –

2

Puede intentar usar una biblioteca como búferes de protocolo; rodar el tuyo probablemente no valga la pena.

+0

Es no funciona con C. – AraK

+0

Hay una versión anterior a la versión 1.0 de los enlaces C para protobuf. Pero es _es_pre-1.0 – lijie

0

Escriba una función para la salida. Use sprintf para imprimir una representación ascii de cada campo en el archivo, un campo por línea.

Escribe una función para la entrada. Usa fgets para cargar cada línea del archivo. Utilice scanf para convertir a binario, directamente en el campo de su estructura.

Si planea hacer esto con una gran cantidad de estructuras diferentes, considere agregar un encabezado a cada archivo, que identifica qué tipo de estructura representa .

Cuestiones relacionadas