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

Bueeeno...vamos progresando. Acabo de conseguir que me funcione la función abrir(), el problema era este:

Código:
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);
}

y un poco arreglada, se queda así:
Código:
void abrir_lista() {

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

    _gasto *aux;
    aux = (_gasto *) malloc(sizeof(_gasto));

    while (!feof(fp)) {
        fread(aux, sizeof(_gasto), 1, fp);
        insertar_en_lista(&DB, *aux);
    }
    
    borrar_ultimo(&DB); 

    fclose(fp);
    free(aux);
}

void borrar_ultimo(_gasto **lista) {

    _gasto *ant, *aux;
    aux = (*lista);
    ant = NULL;

    while(aux->siguiente != NULL) {
        ant = aux;
        aux = aux->siguiente;
    }
    if (aux->siguiente == NULL) {
        ant->siguiente = NULL;
        free(aux);
    }
}
Como podéis ver, he hecho una nueva función: borrar_ultimo(); que se encarga de borrar el ultimo registro de la lista. Solo funciona si la lista tiene 1 registro o más. Esto lo hago porque cuando leo los registros, me muestra duplicado el ultimo. Supongo que será porque en ningun momento hago que la lista tome el valor NULL, pero no lo se. ¿Alguien me lo puede confirmar?

La función para mostrar la lista es esta:

Código:
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();
    }
}
Supongo que lo que hace que me muestre el ultimo dubplicado es lo que hay en rojo.

Bueno, pues poco a poco voy consiguiendo que vaya funcionando. Ire poniendo aquí mis progresos por si le pudiera servir a alguien en un futuro...

Saludos.