• Viernes 8 de Noviembre de 2024, 17:10

Autor Tema:  Lectura De Estructuras De Archivo Binario  (Leído 2408 veces)

telecoAST

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Lectura De Estructuras De Archivo Binario
« en: Lunes 19 de Mayo de 2008, 15:53 »
0
Hola, antes que nada quisiera presentarme. Me llamo Antonio, soy un estudiante de Telecomunicaciones que está realizando su proyecto fin de carrera. Un saludo a todos.

Ahora viene mi cuestion. Pues resulta que tengo que trabajar con un fichero binario en el cual tengo que almacenar una serie de estructuras. El problema lo tengo en la lectura, ya que a priori no se que tipo de estructuras tengo que leer(digamos que en la escritura del fichero no siempre es igual, y dependiendo de diversas variables, puedo escribir estructuras distintas en numero y tipo). Lo que tenia pensado era, antes de mandar las estructuras, hacerme un vector donde indicara el tamaño de cada una y luego leerla en un vector de punteros a void.


void * estructuras;
int * tamEstruct;
...

// Leemos el vector q contiene el tamaño de cada una de las estuct. a leer
for(i=0;i<numBloques;i++)
fread ((tamEstruct+i), sizeof(int), 1, fich);
// Quinto parametro a leer = Estructuras
for(i=0;i<numBloques;i++)
fread ((estructuras+i), *(tamEstruct+i), 1, fich); <<<< error

>>>>> "ficheros.c", line 250: error: expression must be a pointer to a complete object type

No se si me habre explicado bien, pero espero que me pregunteis si no queda claro y yo poco a poco intente explicarlo mejor, y haber si puedo resolver este problema. Os estare eternamente agradecido por vuestra ayuda.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Lectura De Estructuras De Archivo Binario
« Respuesta #1 en: Lunes 19 de Mayo de 2008, 16:21 »
0
Hola,
si tienes claro los tipos de estructuras con los que cuentas (siempre vas a escribir tres tipos de estructuras distintas, por ejemplo) puedes hacer una reserva dinámica de memoria siguiendo el método que antes exponías...

Por ejemplo...
en la cabezera dice que tienes 10 estructuras de tipo 1, 4 de tipo 2, 3 de tipo 3 y 9 de tipo 2...

Pues nada, reservas memoria con un malloc y creas espacio para contener una estructura de tipo 1, lees las 10 estructuras una tras otra, luego haces un realloc o un free y un nuevo malloc con un espacio para estructuras de tipo 2, lees las 4 estructuras y de nuevo haces una nueva reserva... Así sucesivamente.

El problema que tienes es que tu apuntador a void, simplemente puede apuntar a cualquier sitio de memoria, pero no has reservado memoria para contener nada, por tanto fread no te puede devolver la estructura porque no has definido espacio para contenerla, dado que a priori no conoces cuánto va a ocupar debes usar memoria dinámica.

Un saludo,
 :lightsabre:
No hay tonto más molesto que el ingenioso.

telecoAST

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Lectura De Estructuras De Archivo Binario
« Respuesta #2 en: Lunes 19 de Mayo de 2008, 16:50 »
0
Hola,
lo de que si se el tipo de estructura y numero de ellas si que tengo claro como se hace

     estruct=(void *)malloc(sizeof(struct s_sos));
     fread ((struct s_sos *)estruct, sizeof(struct s_sos), 1, fich);

Este trozo de codigo es de una prueba que hice. El problema que tengo reside precisamente en que no se de que tipo son las estructuras que leo. El numero de ellas si lo se, ademas tambien se el tamaño de cada una de ellas (antes de leer las estructuras leo un vector el cual incluye los tamaños de todas:
    tamEstruct[0]=sizeof(struct left);
    tamEstruct[1]=sizeof(struct proc1);
    tamEstruct[2]=sizeof(struct proc1);
    tamEstruct[3]=sizeof(struct combinador);  
    fwrite(&tamEstruct[0], sizeof(struct left), 1, fich1);
    fwrite(&tamEstruct[1], sizeof(struct proc1), 1, fich1);
    fwrite(&tamEstruct[2], sizeof(struct proc1), 1, fich1);                    
    fwrite(&tamEstruct[3], sizeof(struct combinador), 1, fich1);  )


Para leer deberia hacer entonces segun me dices de reservar memoria algo parecido a:

for(i=0;i<numBloques;i++){
    *(estructuras+i)=malloc(*(tamEstruct+i)); // Aqui es cuando reservo la memoria
    fread (*(estructuras+i), *(tamEstruct+i), 1, fich);                
}    

No?

telecoAST

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Lectura De Estructuras De Archivo Binario
« Respuesta #3 en: Lunes 19 de Mayo de 2008, 16:56 »
0
Ok, todo resuelto, el codigo que he posteado antes sería correcto declarando:

void ** estructuras;

Asi estructuras seria un puntero que apunta al comiendo de un vector que contiene punteros a void (los cuales tienen reservada la memoria correspondiente a su estructura, sin saber exactamente cual es).

Muchas gracias, cuando me has dicho lo de reserva de memoria dinamica me as conducido a observar el error, muchas gracias.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Lectura De Estructuras De Archivo Binario
« Respuesta #4 en: Lunes 19 de Mayo de 2008, 18:11 »
0
de nada, me alegro que hayas llegado a la solución  :comp:

Un saludo,
 :lightsabre:
No hay tonto más molesto que el ingenioso.