Gestión dinámica memoria

Iniciado por terrateck, 9 Enero 2014, 04:32 AM

0 Miembros y 2 Visitantes están viendo este tema.

terrateck

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.

naderST

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.

terrateck

Gracias por tu respuesta naderST.

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

naderST

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.

terrateck

#4
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.

leosansan

Cita de: terrateck en  9 Enero 2014, 04:32 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! ..... !!!!       


naderST

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.

amchacon

Cita de: 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.
Creo que es de las soluciones más eficientes.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

terrateck

Gracias, estudiaré adoptar estas soluciones.