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

Gabriel Casarsa gabriel_casarsa en yahoo.com.ar
Dom Ene 27 05:32:07 CET 2013


Despues de lidiar un poco, salio todo perfecto. Gracias por la paciencia!
No sabia que el fscanf leia hasta el espacio!

--- El sáb 26-ene-13, Davidson, Steven <srd4121 en njit.edu> escribió:

De: Davidson, Steven <srd4121 en njit.edu>
Asunto: Re: [C con Clase] Duda para almacenar datos leidos desde un archivo
Para: "Lista de correo sobre C y C++" <cconclase en listas.conclase.net>
Fecha: sábado, 26 de enero de 2013, 21:16

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] -------+                     |                    Vlista[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


-----Adjunto en línea a continuación-----

_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130126/c6b6869d/attachment.html>


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