Ver Mensaje Individual
  #6 (permalink)  
Antiguo 18/01/2008, 14:17
numero5
 
Fecha de Ingreso: enero-2008
Mensajes: 5
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: problema leyendo un archivo con estructuras

nada, no hay manera...

entiendo el funcionamiento de las listas, he creado un programa totalmente distinto, pero sigue dandome problemas en la funcion abrir() (que es la misma pero adaptada). Si alguien pudiera darme algun ejemplo de como leer estructuras de un archivo le estaría eternamente agradecido...solo me vale hacerlo en modo binario, ya que si no, obtengo una única variable con todos los datos de la estructura, y yo necesito ir obteniendo cada estructura que haya en el archivo para insertarla en la lista enlazada.

Aquí os dejo el programa:
Código:
#include <stdio.h>
#define MAX_N 10 /* MAX_NOMBRE */
#define MAX_C 30 /* MAX_CONCEPTO */
#define MAX_R 999 /* MAX_REGISTROS */

typedef struct {
    int dia;
    int mes;
    int anyo;
} _fecha;


struct gasto{
    char i;
    char nombre[MAX_N];
    char concepto[MAX_C];
    _fecha fecha;
    float importe;
    struct gasto * siguiente;
};
typedef struct gasto _gasto;

_gasto *DB;

void menu();
void crear_lista(_gasto **lista);
void mostrar_lista(_gasto *);
void insertar_en_lista(_gasto **lista, _gasto dato);
void borrar_elemento_lista(_gasto **lista, int n_borrar);
void abrir_lista();


int main(int argc, char argv[]) {
    crear_lista(&DB);
    menu();
    return 0;
}

void crear_lista(_gasto **lista) {
    *lista = NULL;
    abrir_lista();
}

void mostrar_lista(_gasto *lista) {

    if (lista != NULL) {
        printf("\n |   N |     NOMBRE |                       CONCEPTO |      FECHA |  IMPORTE |\n");
        while(lista != NULL) {
            printf(" | %3d | %10s | %30s | %2i/%2i/%4i | %5.2f |\n",
                   lista->i, lista->nombre, lista->concepto, lista->fecha.dia,
                   lista->fecha.mes, lista->fecha.anyo, lista->importe);
            lista = lista->siguiente;
        }
        printf("\n Presione cualquier tecla para volver al menu...\n");
        getch();
    }else{
        printf("\n La lista esta vacia! Presione cualquier tecla para volver al menu...\n");
        getch();
    }
}

void insertar_en_lista(_gasto **lista, _gasto dato) {

    _gasto *p;

    if((*lista) != NULL) {
        insertar_en_lista(&((*lista)->siguiente), dato);
    }else{
        p = (_gasto *) malloc(sizeof(_gasto));
        *p = dato;
        p->siguiente = NULL;
        (*lista) = p;
    }
}

void borrar_elemento_lista(_gasto **lista, int n_borrar) {

    _gasto *borrar, *ant, *sig;

    if ((*lista) == NULL) {
            printf("\n La lista esta vacia! Presiona cualquier tecla para volver al menu...");
            getchar();
            getchar();
            menu();
        }

    if ((*lista)->i != n_borrar) { /* Si no es el registro que quiero borrar... */
        if((*lista)->i == n_borrar-1) { /* ...si es el registro anterior... */
            ant = (_gasto *) malloc(sizeof(_gasto));
            ant = (*lista); /*...lo guardo en ant. */
        }
        borrar_elemento_lista(&((*lista)->siguiente), n_borrar); /* Sigo buscando el registro que quiero... */
    }else{ /* Si si que es el registro que hay que borrar */
        borrar = (_gasto *) malloc(sizeof(_gasto));
        borrar = (*lista); /* lo guardo en borrar */
        sig = (_gasto *) malloc(sizeof(_gasto));
        sig = borrar->siguiente; /* y guardo en sig el registro siguiente al que quiero borrar */
        ant->siguiente = sig; /* y hago que el registro siguiente a ant apunte a sig */
        printf("DONE!");
    }
}

void abrir_lista() {

    FILE * fp;
    fp = fopen("gastos.dts", "rb");

    _gasto *aux;
    aux = (_gasto *) malloc(sizeof(_gasto));
    aux->siguiente = (_gasto *) malloc(sizeof(_gasto));

    while (!feof(fp)) {
        fread(aux, sizeof(_gasto), 1, fp);
        insertar_en_lista(&DB, *aux);
        aux = aux->siguiente;
    }
    aux->siguiente = NULL;

    fclose(fp);

    free(aux);
}

void menu() {

    /* Borrro la pantalla */
    system("CLS");

    /* Declaro las variables encesarias */
    _gasto dato;
    int i = 0, estado = 0, opcion, n_borrar;

    /* Escribo el menu y pido que elija */
    printf("\n MENU\n\n [1] - Introducir elementos en la lista.\n [2] - Mostrar lista\n [3] - Borrar un elemento.\n [0] - Salir.\n\n Elija: ");
    scanf(" %d", &opcion);

    /* Segun lo que elija, hago */
    switch(opcion) {

        /* Salir */
        case 0:
        break;

        /* Insertar elemento en lista */
        case 1:
        do{
            getchar();
            dato.i = i; i++;
            printf("\n Nombre: ");
            gets(dato.nombre);
            printf(" Concepto: ");
            gets(dato.concepto);
            printf(" Fecha (ddmmaaaa): ");
            scanf("%2d%2d%4d", &dato.fecha.dia, &dato.fecha.mes, &dato.fecha.anyo);
            printf(" Importe (€): ");
            scanf("%f", &dato.importe);
            insertar_en_lista(&DB, dato);
            printf("\n Quieres introducir otro gasto? (SI = 1, NO = 0): ");
            scanf("%d", &estado);
        }while (estado);
        puts("\n");
        mostrar_lista(DB);
        menu();
        break;

        /* Mostrar la lista */
        case 2:
        mostrar_lista(DB);
        menu();
        break;

        /* Borrar un registro de la lista */
        case 3:
        printf("\n Introduce el numero del resgistro que quieres borrar: ");
        scanf("%d", &n_borrar);
        borrar_elemento_lista(&DB, n_borrar);
        mostrar_lista(DB);
        menu();
        break;

        /* Si no elige ninguna opcion */
        default:
        menu();
        break;

    }
}
Este codigo me da dos errores. Uno en la funcion borrar_elemento_lista(). El error lo produce la linea marcada en rojo, y no entiendo porque.

El otro, y el que quisiera que alguien me ayudara, es el de la funcion abrir(). No consigo que funcione de ninguna manera, y necesito que lo haga...si alguien pudiera solucionarme este error se lo agradeceria mucho. Yo, después de 2 dias de intentarlo y de acudir a este foro como última solución, ya no se que hacer...

Gracias por adelantado,
saludos.