Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Mi programa guarda basura al leer un archivo

Estas en el tema de Mi programa guarda basura al leer un archivo en el foro de C/C++ en Foros del Web. Buenos días a todos, me dirijo a ustedes con este primer post para ver si me pueden ayudar en el siguiente problema: He creado un ...
  #1 (permalink)  
Antiguo 03/04/2015, 08:39
 
Fecha de Ingreso: abril-2015
Ubicación: Valparaíso
Mensajes: 2
Antigüedad: 9 años
Puntos: 0
Mi programa guarda basura al leer un archivo

Buenos días a todos, me dirijo a ustedes con este primer post para ver si me pueden ayudar en el siguiente problema:

He creado un código que guarda datos de un paciente en un arreglo de structs (por el momento, luego lo implementaré en listas y otros TDAs), pero cuando guardo los datos del paciente, no solamente guardo esos, sino también basura a continuación de cada dato (símbolos raros, letras raras, etc). He pensado en otras maneras de hacerlo, pero me urge saber por qué es que mi programa guarda basura. A continuación les dejo el código y una captura para que vean de lo que les hablo. De antemano, muchas gracias!

http://gyazo.com/0fcbc9f70700df76ec257becb46ac950

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. typedef struct datos
  5. {
  6.     char nombre[30];
  7.     char apellido[30];
  8.     char rut[30];
  9.     char anios[30];
  10.     int prio;
  11. }DATOS;
  12.  
  13. int main()
  14. {
  15.     DATOS X[4];
  16.     int i=0,j=0;
  17.     char car;
  18.  
  19.     FILE*in;
  20.     in=fopen("datos.txt","r");
  21.  
  22.     while(!feof(in))
  23.     {
  24.  
  25.         do
  26.         {
  27.             car=fgetc(in);
  28.             X[i].apellido[j]=car;
  29.             j++;
  30.         }
  31.         while(car!=',');
  32.  
  33.         X[i].apellido[j-1]="\0";
  34.         j=0;
  35.  
  36.         do
  37.         {
  38.             car=fgetc(in);
  39.             X[i].nombre[j]=car;
  40.             j++;
  41.         }
  42.         while(car!=',');
  43.  
  44.         X[i].nombre[j-1]="\0";
  45.         j=0;
  46.  
  47.         do
  48.         {
  49.             car=fgetc(in);
  50.             X[i].rut[j]=car;
  51.             j++;
  52.         }
  53.         while(car!=',');
  54.  
  55.         X[i].rut[j-1]="\0";
  56.         j=0;
  57.  
  58.         do
  59.         {
  60.             car=fgetc(in);
  61.             X[i].anios[j]=car;
  62.             j++;
  63.         }
  64.         while(car!='\n');
  65.  
  66.         X[i].anios[j-1]="\0";
  67.         j=0;
  68.  
  69.  
  70.         car=fgetc(in);
  71.         fscanf(in,"%d",&X[i].prio);
  72.         i++;
  73.     }
  74.  
  75.     for(i=0;i<4;i++)
  76.     {
  77.  
  78.             printf("\n%s",X[i].apellido);
  79.             printf("\n%s",X[i].nombre);
  80.             printf("\n%s",X[i].rut);
  81.             printf("\n%s",X[i].anios);
  82.             printf("\n%d",X[i].prio);
  83.     }
  84.  
  85.  
  86. return 0;
  87. }
  #2 (permalink)  
Antiguo 03/04/2015, 08:53
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Mi programa guarda basura al leer un archivo

Cuando creas un objeto de una estructura esa puede contener residuos. Para evitar eso cuando crees un objeto(declaración) de una estructura cualquiera haga tipoEstructura nombreEstructura = {0};. Con eso todos los campos estarán establecido a nulos y ya no tendrás residuos.

Otra forma de formatear una estructura es usar strcpy asi: strcpy (X[0].nombre, "");

haga tipoEstructura nombreEstructura = {0}; tanto antes de guardar como antes de leer el archivo, así puedes estar seguro que la estructura estará limpia.
  #3 (permalink)  
Antiguo 03/04/2015, 10:19
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Mi programa guarda basura al leer un archivo

Cita:
Iniciado por vangodp Ver Mensaje
Cuando creas un objeto de una estructura esa puede contener residuos. Para evitar eso cuando crees un objeto(declaración) de una estructura cualquiera haga tipoEstructura nombreEstructura = {0};. Con eso todos los campos estarán establecido a nulos y ya no tendrás residuos.

Otra forma de formatear una estructura es usar strcpy asi: strcpy (X[0].nombre, "");

haga tipoEstructura nombreEstructura = {0}; tanto antes de guardar como antes de leer el archivo, así puedes estar seguro que la estructura estará limpia.
yo en vez de crear la estructura cada vez para limpiarla haria memset(&estructura,0,sizeof(estructura));
  #4 (permalink)  
Antiguo 03/04/2015, 13:02
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Mi programa guarda basura al leer un archivo

Cita:
yo en vez de crear la estructura cada vez para limpiarla haria memset(&estructura,0,sizeof(estructura));
Yo no he dicho eso. He dicho que a la hora de declararla se le de el valor de cero. Has entendido lo que has querido pero no es así.
  #5 (permalink)  
Antiguo 03/04/2015, 13:40
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Mi programa guarda basura al leer un archivo

Hola, sé que has realizado tu programa en c, pero no sé si se puede hacer también como en c++ unos constructores para un sctruct, así evitas al crear una estructura de tipo datos, los miembros tengas valores inesperados.

Código C++:
Ver original
  1. struct datos{
  2.     char nombre[30];
  3.     char apellido[30];
  4.     char rut[30];
  5.     char anios[30];
  6.     int prio;
  7.     datos();
  8. };
  9. datos::datos(){
  10.     for (int i = 0; i < 30; i++){
  11.         nombre[i] = 0;
  12.         apellido[i] = 0;
  13.         rut[i] = 0;
  14.         anios[i] = 0;
  15.     }
  16.     prio = 0;
  17. }

Saludos.

Etiquetas: basura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:25.