fwrite y estructuras

Iniciado por m@o_614, 4 Noviembre 2013, 02:14 AM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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()??

typedef struct
{
    char nombre[MAX];
    int edad;
    char ciudad_residencia[MAX];
}Persona;


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

int main()
{
    FILE *fd;
    Persona p;
    agregarDatos(&p);
    if((fd = fopen("F:\\gente.txt","w"))!=NULL)
    {
        fwrite(p.nombre,sizeof(char),strlen(p.nombre),fd);
        fwrite(&p.edad,sizeof(int),1,fd);// aqui esta el error
        fwrite(p.ciudad_residencia,sizeof(char),strlen(p.ciudad_residencia),fd);
    }
    else
       printf("No se pudo crear archivo\n");
    return 0;
}


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

de antemano gracias


walrus10

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.

rir3760

Cita de: m@o_614 en  4 Noviembre 2013, 02:14 AMsi 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:
fwrite(&p, sizeof p, 1, fd);

Cita de: m@o_614 en  4 Noviembre 2013, 02:14 AMel 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

m@o_614

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 35
#define TAM 50
/*
   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".
*/

typedef struct
{
    char nombre[MAX];
    int edad;
    char ciudad_residencia[MAX];
}Persona;

void agregarDatos(Persona *p);

int main()
{
    FILE *fd,*ap;
    Persona p,persona;
    agregarDatos(&p);
    if((fd = fopen("F:\\gente.dat","w"))!=NULL)
    {
        fwrite(&p,sizeof(p),1,fd);
        fclose(fd);
        if((ap = fopen("F:\\gente.dat","r"))!=NULL)
        {
            fread(&persona,sizeof(p),1,ap);
            printf("%s",persona.nombre);
            printf("%d",persona.edad);
            printf("%s",persona.ciudad_residencia);
        }
    }
    else
       printf("No se pudo crear archivo\n");
    return 0;
}

void agregarDatos(Persona *p)
{
    char buffer[MAX];
    printf("Dame nombre: ");
    fgets(p->nombre,MAX,stdin);
    printf("Dame edad: ");
    fgets(buffer,MAX,stdin);
    sscanf(buffer,"%d",&p->edad);
    printf("Dame ciudad de residencia: ");
    fgets(p->ciudad_residencia,MAX,stdin);
}


gracias

rir3760

Cita de: m@o_614 en  5 Noviembre 2013, 03:11 AMpero 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language