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

ficheros binarios C

Estas en el tema de ficheros binarios C en el foro de C/C++ en Foros del Web. hola a todos, estoy intentado hacer un programa que me permita crear una lista de personas y despues guardarla en un fichero binario y en ...
  #1 (permalink)  
Antiguo 24/03/2010, 09:24
 
Fecha de Ingreso: octubre-2008
Mensajes: 118
Antigüedad: 15 años, 6 meses
Puntos: 2
ficheros binarios C

hola a todos, estoy intentado hacer un programa que me permita crear una lista de personas y despues guardarla en un fichero binario y en la proxima ejecucion cargar esta lista desde el fichero binario. Hasta el momento he conseguido crear la lista y guardarla pero cuando intento cargarla no me lee el archivo, tmp me da error, las funciones que estoy utilizando son estas:


Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct personas {
    char nombre[15];
    int edad;
    struct personas *siguiente;
};

// carga el fichero(Solo la primera persona)
void cargar(char *archivo, struct personas **ultima, struct personas **primera, int *nPersonas){

    FILE *fichero;
    char nom[15];
    if (fichero=fopen(archivo,"rb") == NULL){
        puts("Error al abrir el fichero");
    } else {
        struct personas *persona=NULL;
            if ((persona=malloc(sizeof(struct personas)))==NULL){
                puts("Error al asignar la memoria");
            } else {
                int cont;
              // leeo los 14 primeros carcteres y los guardo en nom
                cont=fread(nom,sizeof(char),14,fichero);
              // intrudozco el caracter nulo al final de la cadena
                nom[14]='\0';
                puts(nom);
                printf("%d",cont);
                fread(persona->edad,sizeof(int),1,fichero);
                persona->siguiente=NULL;
                if (*primera==NULL){
                    *primera=persona;
                    *ultima=persona;
                } else {
                    (**ultima).siguiente=persona;
                    *ultima=persona;
                }
                (*nPersonas)++;
            }
        fclose(fichero);
        printf("Cargado completo, hay %d personas\n",(*nPersonas));
    }

}

// guarda la lista de personas al fichero
void guardar(char *archivo, struct personas *primera){


        FILE *fichero;
        if ((fichero=fopen(archivo,"wb"))==NULL){
            puts("Error en la escritura del archivo");
        } else {
            fflush(stdin);
            struct personas *perActual=primera;
            while (perActual!=NULL) {
                fwrite(perActual->nombre,sizeof(char),14,fichero);
                fwrite(&perActual->edad,sizeof(int),1,fichero);
                perActual=perActual->siguiente;
            }
            fflush(fichero);
            fclose(fichero);
            puts("Guardado completo");
        }
}
void insertar(struct personas **primera, struct personas **ultima, int *nPersonas){

    struct personas *persona=NULL; //puntero que apuntara a la persona q estamos creando
    char nom[15];

// asignamos el espacio de memoria necesario para la persona
    if ((persona=malloc(sizeof(struct personas)))==NULL){
        puts("Error al asignar la memoria");
    } else {
        int cont=0;
        // pedimos los datos de la persona
        puts("Dime el nombre de la persona: ");
        gets(nom);
       // completamos con espacios para llegar a los 14 caracteres
        for (cont=strlen(nom);cont<14;cont++){
            nom[cont]=' ';
        }
      // introducimos el caracter nulo al final de la cadena
        nom[cont]='\0';
        strcpy(persona->nombre,nom);
        fflush(stdin);
        puts("Dime la edad: ");
        scanf("%d",&persona->edad);
        fflush(stdin);
        persona->siguiente=NULL;
        // ponemos siguiente a null ya que la persona actual sera la ultima
        if (*primera==NULL){
            // si primera es null no tenemos personas y la primera y ultima seran la actual
            *ultima=persona;
            *primera=persona;
        } else {
            // si ya tenemos personas el puntero siguiente de la ultima persona apuntara
            // a la actual y la ultima sera esta
            (**ultima).siguiente=persona;
            *ultima=persona;
        }
        (*nPersonas)++;
        puts("Insercion correcta");
    }
}

void mostrar(struct personas *primera){

    if ((primera==NULL)){
        puts("No hay personas insertadas");
    } else {
        struct personas *perActual=primera;
        // asignamos la primera persona al puntero y mos tramos sus datos
        do {
            printf("Nombre: %s\nEdad: %d\n",perActual->nombre, perActual->edad);
            // buscamos la siguiente persona y apuntamos a ella
            perActual=perActual->siguiente;
        } while(perActual!=NULL);
        
    }
}
y el main

Código:
#include <stdio.h>
#include <stdlib.h>
struct personas {
    char nombre[15];
    int edad;
    struct personas *siguiente;
};
/*
 * 
 */
void main() {

    int opcion=10;
    char *archivo = "archivo.dat";
    struct personas *primera=NULL;
    struct personas *ultima=NULL;
    int nPersonas=0;

     while (opcion!=0){
        puts("1. Cargar archivo");
        puts("2. Guardar archivo");
        puts("3. Insertar");
        puts("4. Mostrar");
        puts("0. Salir");
        puts("Haga su eleccion");
        scanf("%d",&opcion);
        fflush(stdin);

        switch(opcion){
            case 1:{
                cargar(archivo, &ultima, &primera, &nPersonas);
                break;
            }
            case 2: {
                guardar(archivo, primera);
                break;
            }
            case 3: {
                insertar(&primera, &ultima, &nPersonas);
                break;
            }
            case 4: {
                mostrar(primera);
                break;
            }
            case 0: {
                puts("Hasta la proxima");
                break;
            }
            default: {
                puts("No es una opcion valida");
            }
        }
     }
}
creo q la funcion fread la estoy escribiendo bien pero nose xk no me lee nada.



Saludos,
Dani.

Última edición por nosek159; 24/03/2010 a las 09:33

Etiquetas: ficheros, binario
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 22:51.