Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Insertar una estructura en un archivo binario en C

Estas en el tema de Insertar una estructura en un archivo binario en C en el foro de C/C++ en Foros del Web. Hola a todos como están?, tengo una pequeña duda que espero me puedan solucionar, veran, me mandaron a hacer un proyecto en C donde debo ...
  #1 (permalink)  
Antiguo 24/05/2015, 12:32
 
Fecha de Ingreso: mayo-2015
Mensajes: 1
Antigüedad: 8 años, 10 meses
Puntos: 0
Insertar una estructura en un archivo binario en C

Hola a todos como están?, tengo una pequeña duda que espero me puedan solucionar, veran, me mandaron a hacer un proyecto en C donde debo hacer una tabla periódica y necesito saber como meter una estructura en un archivo Binario para que se me haga más fácil la tarea de ir cargando la información de los elementos. Me recomendaron que usará un solo archivo Binario para todo por lo que si me pueden decir como cargar varias veces la estructura en el archivo se los agradecería mucho.

Espero me puedan ayudar y de antemano gracias!!.
  #2 (permalink)  
Antiguo 25/05/2015, 03:16
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Insertar una estructura en un archivo binario en C

Básicamente abres un fichero y guardas cada variable por separado por mucha estructura que sea ya que de no ser así puedes tener problemas con el alineamiento de los miembros de la estructura. Si quieres buscar por tu cuenta más sobre el tema busque Byte align o alineamiento de bytes en C.

lo entenderás si haces un sizeof de una estructura como esta:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. struct s{
  4.     char c;   //1Byte ?
  5.     int i;    //4Bytes? 1+4 = 8 WTF! Y aun peor... yo veo 8 pero tu puede ver otra cosa =O
  6. }BA;  //Byte Align =D
  7.  
  8. int main (){
  9.    
  10.     printf("%d",sizeof(BA) );
  11.    
  12.     getchar();
  13.     return 0;
  14. }

Hace poco ha habido dudas similares donde se explico el problema. http://www.forosdelweb.com/f96/posic...eda-c-1124666/

Lo que debes evitar es enviar toda la estructura a el archivo de una sola pieza, ya que el compilador alinea de una forma automática y poco transparente al programador, por motivos de rendimiento, inflandolos algunos de ellos para que tengan un tamaño más o menos igualados. Pero la cosa no termina ahí, el problema es que cada compilador lo hace a su manera, y dependiendo de una serie de factores como arquitectura, sistema operativo, el orden en los que se presentan los datos en la estructura, y un sin fin de parámetros más, verás como un programa que parecía funcionar bien en tu computadora, puede sin motivos aparentes, fallar en la computadora de tu maestro, ni tu y dependiendo se sus conocimientos, ni el, van a enterarse el porque del fallo, y desde luego os digo que no será por vuestra culpa si no del padding(relleno) y del Byte align(alineamiento de Bytes).

Te recomiendo que si tienes una estructura estilo la de arriba con un char y un int dentro, lo mejor es enviar BA.c y luego BA.i al archivo que enviar BA que contenga ambas, como has visto con el sizeof, para nada se parece a la suma de ambos objetos.

printf("%d",sizeof(BA) ); no se parece para nada a printf("%d",sizeof(BA.c) + sizeof(BA.i) ); que es la suma de los componentes. veras que sizeof(BA) te da un resultado inflado. Eso lo hace por que es mucho más rápido buscar datos de igual tamaño en memoria que de tamaños variados.

Si no sabes como hacer, al menos pega la estructura aquí, y te monto un par de funciones que lean y impriman desde, y hacia un fichero.

Si tienes la oportunidad pregunte a tu maestro por el alineamiento de bytes, y a ver si te puede aprender sobre ese caso especial, te aseguro que es muy importante, ni te lo imaginas. ;)

Etiquetas: estructuras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:23.