/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Punteros y datos basura =S

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Ken_Masters



Registrado: 08 Abr 2005
Mensajes: 33

MensajePublicado: 02/02/2009 11:14 pm
Título: Punteros y datos basura =S

Hola y buen día a todos, verán tengo unas pequeñas dudas con respecto a un código que es el siguiente :

Código:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


struct personaje
{
   char nombre[10];
   char hp[10];
   char mp[10];
};




int main()

   struct personaje personaje1;   
   FILE *archivo;
   int x=0;
   archivo = fopen("C:/fichero_fwrite.txt","w+");
   do
   { 
       printf("Introduce el nombre:"); fflush(stdout);
       gets(personaje1.nombre);
       printf("Introduce el hp:");     fflush(stdout);
       gets(personaje1.hp);
       printf("Introduce el mp:");      fflush(stdout);
       gets(personaje1.mp);
       fwrite(&personaje1,sizeof(personaje1),1,archivo);
       printf("Desea agregar otro personaje?"); fflush(stdout);
       fflush(stdout);
       scanf("%i",&x); fflush(stdout);
   }  while (x!=1);
   fclose(archivo); 
}


No me genera ningún error y "funciona", sin embargo, a la hora de checar el archivo que generé me encuentro con datos basura entre los datos del registro, por ejemplo supongamos que personaje1.nombre="fulano",personaje1.hp="45",personaje1.mp="3".
En el archivo se muestra esto :

fulano h<45 ­®Àw3 #C¶€|¨ÿ

¿Qué se supone que tengo que hacer para que esta basura no me aparezca?.

La otra duda es que si cambio la definición del struct por :
Código:

struct personaje
{
   char nombre[];
   char hp[];
   char mp[];
};


No me genera ningún error pero el archivo se genera completamente vacío, y si escribo el struct como :
Código:

struct personaje
{
   char *nombre;
   char *hp;
   char *mp;
};


Me genera un error en tiempo de ejecución a la hora de leer cualquiera de los tres campos,el error es del tipo "windows a detectado un error y debe cerrarse" ¿estoy haciendo algo mal o de plano no se puede hacer con ninguna de estas definiciones?

Saludos y gracias por su tiempo XD
Volver arriba
polly



Registrado: 19 Jul 2007
Mensajes: 356

MensajePublicado: 03/02/2009 5:34 am
Título:

es porque estas usando fwrite (binario) si quieres leer los datos que escribes en un fichero usa fprintf o fputs (texto)
_________________
________________
R.I.P Kurt Cobain
SO: Linux
Compilador: GCC
Volver arriba
Ken_Masters



Registrado: 08 Abr 2005
Mensajes: 33

MensajePublicado: 03/02/2009 8:58 am
Título:

Ok gracias, pero lo que sucede es que necesito guardar la info de esa manera (con fwrite), o sea pasar la variable de tipo personaje (que es una estructura) para que escriba sus datos en el archivo y que yo sepa con las demás funciones no se puede hacer esto (o sea pasar estructuras como parámetros). Ya cambié el modo de apertura por "wb+" pero me sigue generando basura, entonces es imposible que no genere eso?
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 4836
Ubicación: Mexico

MensajePublicado: 03/02/2009 10:39 am
Título:

Por partes:

* Tal como esta el programa de Ken_Masters este tiene un error importante y bastante comun causado por el uso intercalado de la funcion gets y scanf.

1) En la primer iteracion del bucle la ultima operacion de lectura es:
Código:
scanf("%i",&x);

El problema es: la funcion scanf se traga todos los caracteres que puedan conformar la representacion de un numero de tipo int pero deja el resto de la linea (por lo menos el avance de linea '\n') en el bufer de la entrada estandar.

2) En la segunda iteracion la primera operacion de lectura es:
Código:
gets(personaje1.nombre);

Esa funcion se traga el '\n' dejado en el paso 1.

Para evitar ese problema habria que replanter el programa o, en el peor de los casos, eliminar el resto de la linea inmediatamente despues de la llamada a scanf mediante el usual:
Código:
{
int ch;

/* Descartamos el resto de la linea */
while ((ch = getchar()) != EOF && ch != '\n')
   ;
}


En cuanto a la "basura" dentro de la estructura una vez almacenada esta en un archivo no hay solucion y se debe a dos factores:

1) Posible "padding" entre los campos de esta.
2) Valores no determinados en los campos, por ejemplo si uno de estos es un array de 10 caracteres (por ejemplo "nombre") y se almacena "pepe" en este solo los primeros cinco elementos del array tienen valores definidos, los demas son "basura".

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Ken_Masters



Registrado: 08 Abr 2005
Mensajes: 33

MensajePublicado: 04/02/2009 7:13 am
Título:

Bueno gracias, tendré que buscar otras alternativas
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 4836
Ubicación: Mexico

MensajePublicado: 04/02/2009 8:53 am
Título:

Si quieres que los valores se almacenen "tal cual" y de forma portable solo tienes que utilizar funciones como fputs/fprintf para imprimir el contenido en el archivo (lo usual es un campo por linea).

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com