| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Ken_Masters
Registrado: 08 Abr 2005 Mensajes: 33
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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:
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
| Publicado: 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
| Publicado: 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 | |
 |
|
|