punteros

mvictoriarubio
20 de Noviembre del 2003
HOLA chic@s,
tengo un problema con punteros.
lo q hace mi programita es, leer lineas de un fichero (para ello utilizo fgets()), parseo su contenido (name y value) y paso a asignar el value al campo de la estructura correspondiente.
voy leyendo linea por linea del fichero, parseo y asigno, por tanto, tengo un
while (fgets(buffer, sizeof(buffer), File)){}
(sale del while cuando he llegado a un name específico)
los campos de la estructura donde voy guardando los value son de tipo char*. mi PROBLEMA es q la dirección de memoria a la q apunta buffer para leer la linea siempre es la misma (para todas las lineas) y por eso, una vez asignado el value al primer campo cuando paso a leer la segunda linea, buffer apunta a la misma dirección, cambiando el contenido claro, pero el primer campo de la estructura, ya guardado anteriormente, cambia de valor (ahora contiene el value de la segunda linea leida).

lo q me gustaría hacer, es asignar sólo el contenido de value y no arrastrar la dirección de memoria. He probado a definir los campos de la estructura de tipo char [], pero tengo problemas....

¿a alguien se le ocurre algo?

MUCHAS GRACIAS!!!
VIC

MariGuanO
20 de Noviembre del 2003
char *fgets( char *s, int n, FILE *stream);
Bien esa funcion dice que va a leer caracteres hasta n-1 del archivo stream. Al tu poner la variable buffer todas las cadenas que se lean carán ahí, dependiendo el tamaño de n, (que tu pusiste sizeof(buffer) ).
Cuando lees la primer linea, buffer ahora vale toda la cadena, y si en tu estructura tienes char* pues no se puede igualar a buffer por que char* por que esa variable solo apunta a 1 tipo char y buffer tiene muchos, asi que lo que tienes que hacer es antes de guadar el contenido de buffer en char* es hacer un ciclo para ver cuantos espacios tiene buffer y dependiendo del numero en que acabe, haces un malloc con tu variable char* que esta en tu estructura y entonces ahora si copeas el contenido.
al ultimo no olvides avanzar el puntero de la lista:
listaux=listaux->siguiente_nodo;
y al terminar el programa, pon free(estructura->variable) para que liberes toda esa memoria que pediste con malloc, ya que si no haces eso, el compilador solo no la libera y tu memoria se te ira llenando hasta que ya no haya mas disponible y tengas que reiniciar.

pigma
20 de Noviembre del 2003
Una posible solución sería que a la hora de asignar el valor, al campo que tienes que que es un char* le hagas una reserda dinámica de memoria (puedes ver la documentación sobre la función malloc, new si usas C++).

Así podrás usar strcpy para copiar la cadena de caracteres.

Nota: No debes olvidar liberar memoria cuando ya no te sea útil (usando free,delete si usas C++)