[C con Clase] Duda para almacenar datos leidos desde un archivo

Davidson, Steven srd4121 en njit.edu
Dom Ene 27 01:16:10 CET 2013


Hola Gabriel,

2013/1/26 Gabriel Casarsa <gabriel_casarsa en yahoo.com.ar>

> Hola Steven, muchas gracias por contestar.****
>
> Cuando hago  fscanf (ptrdel, "%s", cadena) != EOF; es para leer hasta
> encontrar un espacio. No se si es la forma de hacerlo, pero anduvo bien je.
>

La función 'fscanf()' ya realiza esta tarea de leer y de guardar hasta
encontrarse con un espacio blanco o con el fin-de-fichero (EOF).

Como dije antes, la expresión es gramaticalmente correcta, pero no tiene
sentido. Es como hacer esto:

5 != 0;

Es correcto, pero no hace nada.

[CORTE]


> Lo que quiero hacer es leer las palabras. La primera es la fecha, luego la
> hora y después, como son 9 zonas hasta iniciar una nueva actualizacion,
> hago un for en el que leo la zona que, luego un carácter de estado de
> alarma y luego, hasta encontrar una “,”, leo los distintos delitos.
> La z me olvide de sacarla, me di cuenta que con j alcanzaba.****
>
> El tema de la longitud de cadena es para los delitos, pero cuando lee zona
> o alarma nunca va a tener mas de 2 o 1 carácter.
>

Entonces sugiero usar 'strncpy()' para asegurar que la copia sea de 1
carácter - más el nulo al final. Por ejemplo,

strncpy( alarma, cadena, 2 );

Sin embargo, como dices que quieres copiar 2 o menos caracteres, entonces
necesitas crear una cadena de 3 caracteres. Recuerda que las cadenas
autoterminadas siempre guardan el carácter nulo al final, por lo que hay
que dejar "hueco" para ello.

****
>
> El “d” nunca va a poder superar la cantidad de 62, que es la maxima
> cantidad de delitos por actualizacion.
>

Entonces debes crear un array de 62 cadenas:

char delitos[62][20] = { "" };

****
>
> Me funciona bien hasta donde probe, pero me parece que me estoy haciendo
> mucho problema con el tema de punteros entonces.****
>
> No entiendo porque zonas[0] = NO; y cuando va a j = 1, ademas de
> actualizar el zonas[1] actualiza el zonas[0].
>

Me temo que necesitas más práctica con el uso de punteros. Un puntero no es
más que una dirección de memoria, la cual es la ubicación de un valor o
posiblemente el primero de una serie (de un array). Por ejemplo,

int num = 10;
int *ptr = #

'ptr' apunta al valor de 'num'. Cualquier cambio a 'num', implica un cambio
de valor si usáremos el puntero, 'ptr'. El puntero es como una asociación o
ligadura a una variable o al valor en una variable.

Lo que estás haciendo es algo así:

int num = 10;
int *lista[3] = { 0 };

for( int i=0; i<3; i++ )
{
  num++;
  lista[i] = #
}

Cada puntero en 'lista' apuntará a la misma variable, a la misma dirección
de memoria, y por tanto al mismo valor que se guarde ahí. Visualmente,
hacemos esto:

lista[0] -------+
                     |
                    V
lista[1] ----> num
                     ^
                     |
lista[2] -------+

Lo mismo ocurre en tu programa, estás apuntando a la misma ubicación de la
cadena. Puedes cambiar el contenido que se guarde en esa memoria - y en
sucesivas ubicaciones - pero sigues apuntando al mismo lugar.

Lo que necesitas es guardar cada cadena en su propia memoria. Por eso
sugiero usar un array de cadenas de caracteres. Si quieres usar punteros,
entonces tienes que crear memoria dinámicamente, con 'malloc()', si usas C;
y liberarla con 'free()'.


Espero que esto aclare las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130126/5954d67e/attachment.html>


Más información sobre la lista de distribución Cconclase