Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 4 Noviembre 2013, 02:14 am



Título: fwrite y estructuras
Publicado por: m@o_614 en 4 Noviembre 2013, 02:14 am
Saludos

si tengo la siguiente estructura en la que tengo campos de tipo cadena y campos de tipo entero, cual es la manera para poder escribirlos en un archivo utilizando a fuerzas la funcion fwrite()??

Código
  1. typedef struct
  2. {
  3.    char nombre[MAX];
  4.    int edad;
  5.    char ciudad_residencia[MAX];
  6. }Persona;
  7.  

el problema que tengo es con el campo int me imprime basura  a la hora de escribir en el archivo:

Código
  1. int main()
  2. {
  3.    FILE *fd;
  4.    Persona p;
  5.    agregarDatos(&p);
  6.    if((fd = fopen("F:\\gente.txt","w"))!=NULL)
  7.    {
  8.        fwrite(p.nombre,sizeof(char),strlen(p.nombre),fd);
  9.        fwrite(&p.edad,sizeof(int),1,fd);// aqui esta el error
  10.        fwrite(p.ciudad_residencia,sizeof(char),strlen(p.ciudad_residencia),fd);
  11.    }
  12.    else
  13.       printf("No se pudo crear archivo\n");
  14.    return 0;
  15. }

tengo entendido que con el fprintf me puedo quitar de problemas, pero tengo que usar a fuerzas el fwrite

de antemano gracias



Título: Re: fwrite y estructuras
Publicado por: walrus10 en 4 Noviembre 2013, 03:12 am
Mira hace mucho que no programo en ese lenguaje pero creo que tenes que hacer un solo fwrite y con sizeof(Persona), porque de lo que se trata es que el struct es de tipo persona y lo que tenes que escribir en el archivo es una serie de personas si no me equivoco.


Título: Re: fwrite y estructuras
Publicado por: rir3760 en 4 Noviembre 2013, 16:46 pm
si tengo la siguiente estructura en la que tengo campos de tipo cadena y campos de tipo entero, cual es la manera para poder escribirlos en un archivo utilizando a fuerzas la funcion fwrite()?
Como ya te comentaron debes imprimir utilizando una sola llamada a fwrite:
Código
  1. fwrite(&p, sizeof p, 1, fd);

el problema que tengo es con el campo int me imprime basura  a la hora de escribir en el archivo
Si con ello te refieres a que el contenido del archivo es ilegible eso es normal ya que la función fwrite escribe un bloque de memoria tal cual, si lo que quieres es texto plano debes utilizar fprintf.

Un saludo


Título: Re: fwrite y estructuras
Publicado por: m@o_614 en 5 Noviembre 2013, 03:11 am
gracias por sus respuestas, el programa me dice:

Crear un “struct” que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia. Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado “gente.dat”, usando “fwrite”. Cerrar el fichero, volverlo a abrir para lectura y mostrar los datos que se habían guardado, que se deben leer con “fread”.

ya entendi como usar el fwrite para escribir en el archivo.dat, pero ahora el problema que tengo es con el fread() que me tiene que recibir los datos leidos del stream y almacenarlos en un buffer o una estructura, pero me aparece basura todavia

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 35
  5. #define TAM 50
  6. /*
  7.    Crear un “struct” que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia.
  8.    Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado “gente.dat”, usando “fwrite”.
  9.    Cerrar el fichero, volverlo a abrir para lectura y mostrar los datos que se habían guardado,
  10.    que se deben leer con “fread”.
  11. */
  12.  
  13. typedef struct
  14. {
  15.    char nombre[MAX];
  16.    int edad;
  17.    char ciudad_residencia[MAX];
  18. }Persona;
  19.  
  20. void agregarDatos(Persona *p);
  21.  
  22. int main()
  23. {
  24.    FILE *fd,*ap;
  25.    Persona p,persona;
  26.    agregarDatos(&p);
  27.    if((fd = fopen("F:\\gente.dat","w"))!=NULL)
  28.    {
  29.        fwrite(&p,sizeof(p),1,fd);
  30.        fclose(fd);
  31.        if((ap = fopen("F:\\gente.dat","r"))!=NULL)
  32.        {
  33.            fread(&persona,sizeof(p),1,ap);
  34.            printf("%s",persona.nombre);
  35.            printf("%d",persona.edad);
  36.            printf("%s",persona.ciudad_residencia);
  37.        }
  38.    }
  39.    else
  40.       printf("No se pudo crear archivo\n");
  41.    return 0;
  42. }
  43.  
  44. void agregarDatos(Persona *p)
  45. {
  46.    char buffer[MAX];
  47.    printf("Dame nombre: ");
  48.    fgets(p->nombre,MAX,stdin);
  49.    printf("Dame edad: ");
  50.    fgets(buffer,MAX,stdin);
  51.    sscanf(buffer,"%d",&p->edad);
  52.    printf("Dame ciudad de residencia: ");
  53.    fgets(p->ciudad_residencia,MAX,stdin);
  54. }
  55.  

gracias


Título: Re: fwrite y estructuras
Publicado por: rir3760 en 6 Noviembre 2013, 02:33 am
pero ahora el problema que tengo es con el fread() que me tiene que recibir los datos leidos del stream y almacenarlos en un buffer o una estructura, pero me aparece basura todavia
El programa funciona correctamente, ¿A que te refieres con "basura"?

Un saludo