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

Hola,

estoy intentando hacer un programa para controlar gastos, y tengo varios problemas. El primero es, que pese a utilizar una lista enlazada para guardar los datos, me toca reservar memoria para los elementos que vaya a utilizar. Si no, no funciona. Esto no puede ser así, me extraña una barbaridad...

Lo segundo es que la funcion abrir(), abre el archivo donde tengo guardados los registros pero no los muestra correctamente. Es decir, yo tengo 4 registros, y normalmente sol ome muestra uno, el primero. A veces, y sin cambair nada, muestra los 4. No entiendo ese comportamiento...

Bueno, ahi bajo dejo el codigo...si alguien me pudiera dar alguna pequeña pista, le estaría tremendamente agradecido...

Código:
#include <stdio.h>
#define MAX_N 10 /* MAX_NOMBRE */
#define MAX_C 30 /* MAX_CONCEPTO */

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


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

_gasto *DB;

void abrir();
void guardar(_gasto *);

int main(char argv[], int argc) {

    DB = (_gasto *) malloc(sizeof(_gasto));
    DB->sigGasto = (_gasto *) malloc(sizeof(_gasto));
    DB->sigGasto->sigGasto = (_gasto *) malloc(sizeof(_gasto));
    DB->sigGasto->sigGasto->sigGasto = (_gasto *) malloc(sizeof(_gasto));

/*  Para guardar los 4 registros


    _gasto *aux;



    _fecha fecha1 = {29, 03, 1989};
    _fecha fecha2 = {30, 03, 1989};
    _fecha fecha3 = {31, 03, 1989};
    _fecha fecha4 = {01, 04, 1989};


    DB->i = 0;
    strcpy(DB->nombre, "Nombre 1");
    strcpy(DB->concepto, "Concepto 1");
    DB->fecha = fecha1;
    DB->importe = 111.0;
    aux = DB; //para no perder el principio de la lista
    DB = DB->sigGasto;

    DB->i = 1;
    strcpy(DB->nombre, "Nombre 2");
    strcpy(DB->concepto, "Concepto 2");
    DB->fecha = fecha2;
    DB->importe = 222.0;
    DB = DB->sigGasto;

    DB->i = 2;
    strcpy(DB->nombre, "Nombre 3");
    strcpy(DB->concepto, "Concepto 3");
    DB->fecha = fecha3;
    DB->importe = 333.0;
    DB = DB->sigGasto;

    DB->i = 3;
    strcpy(DB->nombre, "Nombre 4");
    strcpy(DB->concepto, "Concepto 4");
    DB->fecha = fecha4;
    DB->importe = 444.0;

    DB->sigGasto = NULL;
*/

    // A VECES ME LOS LEE TODOS Y A VECES SOLO ME PONE ESTO:
    //  |   0 |   Nombre 1 |                     Concepto 1 | 29/ 3/1989 |     0 |
    abrir();
    return 0;
}


// Cada ejecucion da un resultado.
void abrir() {

    FILE * fp;
    fp = fopen("gastos.dts", "rb");
    _gasto *aux;
    aux = (_gasto *) malloc(sizeof(_gasto));

    while (!feof(fp)) {
        fread(aux, sizeof(_gasto), 1, fp);
        printf(" | %3d | %10s | %30s | %2i/%2i/%4i | %5i |\n",
                aux->i, aux->nombre, aux->concepto, aux->fecha.dia,
                aux->fecha.mes, aux->fecha.ano, aux->importe);
        aux = aux->sigGasto;
    }

    fclose (fp) ;
}


void guardar(_gasto *guardar) {

    FILE * fp;
    int contador = 0;

    /* Abro el archivo gastos.dts para escritura */
    fp = fopen("gastos.dts", "wb");

    /* Mientras que haya algun registro "gasto" lo escribe en el archivo gastos.dts */
    while (guardar != NULL) {
        fwrite(guardar, sizeof(_gasto), 1, fp);
        guardar = guardar->sigGasto;
        contador++;
    }

    /* Cierra el arhivo */
    fclose(fp);

    printf("Datos guardados: %i", contador);
}
Gracias por adelantado,
saludos.