Autor
|
Tema: Gestión dinámica memoria (Leído 2,613 veces)
|
terrateck
Desconectado
Mensajes: 11
|
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.
|
|
« Última modificación: 9 Enero 2014, 04:44 am por terrateck »
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
terrateck
Desconectado
Mensajes: 11
|
Gracias por tu respuesta naderST.
Parece una buena idea. ¿Hay alguna función que permita obtener directamente el tamaño de un fichero abierto?
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
terrateck
Desconectado
Mensajes: 11
|
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.
|
|
« Última modificación: 9 Enero 2014, 06:25 am por terrateck »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
..................................................................
¿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! ..... !!!!
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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.
|
|
|
En línea
|
|
|
|
terrateck
Desconectado
Mensajes: 11
|
Gracias, estudiaré adoptar estas soluciones.
|
|
|
En línea
|
|
|
|
|
|