Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: terrateck en 9 Enero 2014, 04:32 am



Título: Gestión dinámica memoria
Publicado por: terrateck en 9 Enero 2014, 04:32 am
Hola a todos, me gustaría plantear la siguiente cuestión:

Tengo un fichero de texto en el que cada linea corresponde a un registro de tipo Struct, y necesito leer y almacenar cada uno de esos registros en memoria.
El problema es que de antemano no sé el número de registros que tendrá el fichero, por lo que no puedo establecer el número de celdas que tendrá el array de tipo Struct.

¿Cual sería la manera más optima de crear el array sin desperdiciar memoria?
He pensado que quizá podría contar el número de lineas del fichero y luego volver al comienzo de nuevo. ¿Alguna otra solución?


Saludos.


Título: Re: Gestión dinámica memoria
Publicado por: naderST en 9 Enero 2014, 05:02 am
Puedes obtener el tamaño del fichero, luego esto lo divides entre el tamaño del registro y te dará la cantidad de registros que hay en el fichero, es decir, el tamaño de tu arreglo.

Ejemplo: Supongamos que tu estructura pesa 4 bytes y el fichero pesa 12 bytes quiere decir que en el fichero hay 3 registros.


Título: Re: Gestión dinámica memoria
Publicado por: terrateck en 9 Enero 2014, 05:17 am
Gracias por tu respuesta naderST.

Parece una buena idea. ¿Hay alguna función que permita obtener directamente el tamaño de un fichero abierto?


Título: Re: Gestión dinámica memoria
Publicado por: naderST en 9 Enero 2014, 05:22 am
No, no hay una función que te permita hacer eso, lo más común es posicionarte al final de archivo y con la función ftell obtienes la posición actual que en este caso sería el tamaño del archivo en bytes.


Título: Re: Gestión dinámica memoria
Publicado por: terrateck en 9 Enero 2014, 06:23 am
El problema es que cada registro no ocupa el mismo espacio dentro del fichero, ya que posee números y cadenas de caracteres de longitud variable. Y estoy trabando en modo texto, no binario.


Título: Re: Gestión dinámica memoria
Publicado por: leosansan en 9 Enero 2014, 06:53 am
..................................................................

¿Cual sería la manera más optima de crear el array sin desperdiciar memoria?
He pensado que quizá podría contar el número de lineas del fichero y luego volver al comienzo de nuevo. ¿Alguna otra solución?
..............................................


Bien lo que propones o crear array con memoria dinámica y luego con calloc ampliar la memoria si necesitas más.

Saluditos! ..... !!!!        (http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Gestión dinámica memoria
Publicado por: naderST en 9 Enero 2014, 22:04 pm
Puedes crear una cabecera para cada registro donde te indique el tamaño real del registro, es decir, que sea una estructura con un campo donde te de el tamaño en bytes del registro real y así puedes ir leyendo hasta almacenar todos los registros en un arreglo dinámico.


Título: Re: Gestión dinámica memoria
Publicado por: amchacon en 9 Enero 2014, 22:22 pm
Puedes crear una cabecera para cada registro donde te indique el tamaño real del registro, es decir, que sea una estructura con un campo donde te de el tamaño en bytes del registro real y así puedes ir leyendo hasta almacenar todos los registros en un arreglo dinámico.
Creo que es de las soluciones más eficientes.


Título: Re: Gestión dinámica memoria
Publicado por: terrateck en 10 Enero 2014, 18:38 pm
Gracias, estudiaré adoptar estas soluciones.