SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: leopopologuitarreta en Jueves 25 de Enero de 2018, 19:45

Título: leer archivo binario
Publicado por: leopopologuitarreta en Jueves 25 de Enero de 2018, 19:45
buenas, tengo un problema al levantar el archivo (o quizas guardar), es un programa de un ingreso de personas que van a un campamento, hecho con arraylist. el problema es que, ingreso datos, los muestro, salgo del programa, pero cuando entro ya no estan, como si no los hubiera levantado. si alguno sabe que puede ser, desde ya se los agradezco  :gracias:

(les dejo las funciones de agregar y listar)


void imprimir_acampante(eAcampante* this, int i)
{
    if(this != NULL)
    {
        gotoxy(1, i);
        printf("%d", this->id);
        gotoxy(5, i);
        printf("%s", this->DNI);
        gotoxy(15, i);
        printf("%s", this->nombre);
        gotoxy(27, i);
        printf("%s", this->apellido);
        gotoxy(39, i);
        printf("%s", this->liderIn);
        gotoxy(56, i);
        printf("%s", this->liderSup);
        gotoxy(71, i);
        printf("%s", this->anexo);
    }
}

void imprimir_acampantes(eAcampante* this, ArrayList* lista)
{
    FILE* archivo;
    int cantidad;

    if((archivo = fopen("acampantes.bin", "rb"))== NULL)
    {
        printf("No se pudo cargar el archivo");
    }
    else
    {
        system("cls");
        gotoxy(1, 2);
        printf("Lista de acampantes\n\n");
        gotoxy(1, 4);
        printf("Id");
        gotoxy(5, 4);
        printf("DNI");
        gotoxy(15, 4);
        printf("Nombre");
        gotoxy(27, 4);
        printf("Apellido");
        gotoxy(39, 4);
        printf("Lider inmediato");
        gotoxy(56, 4);
        printf("Lider superior");
        gotoxy(71, 4);
        printf("Anexo");

        while(!feof(archivo))
        {
            cantidad = fread(&this, sizeof(this), 1, archivo);

            if(cantidad!=1)
            {
                if(feof(archivo))
                    break;
                else
                {
                    perror("No leyo el ultimo registro");
                    break;
                }
            }

            for(int i=0; i<lista->len(lista); i++)
            {
                this = (eAcampante*)lista->get(lista, i);
                imprimir_acampante(this, i+5);
            }
        }
    }
    fclose(archivo);
    printf("\n\n\n");
    system("pause");
}

void agregar_acampante(eAcampante* this, ArrayList* lista)
{
    FILE* archivo;
    char auxCad[25];
    int aux;
    int id;
    this = nuevo_acampante();

    if((archivo = fopen("acampantes.bin", "ab"))==NULL)
    {
        printf("No existe el archivo.");
        getch();
    }
    else
    {
        if(this != NULL)
        {
            system("cls");
            printf("**Alta acampante**\n\n");
            printf("Ingrese id: ");
            scanf("%d", &id);
            // valido id
            acampante_setID(this, id);

            printf("Ingrese nombre: ");
            fflush(stdin);
            gets(auxCad);
            while(strlen(auxCad)>25)
            {
                printf("reingrese nombre. (max 25.)");
                gets(auxCad);
            }
            strcpy(this->nombre, auxCad);
            printf("Ingrese apellido: ");
            fflush(stdin);
            gets(auxCad);
            while(strlen(auxCad)>25)
            {
                printf("reingrese apellido. (max 25.)");
                gets(auxCad);
            }
            strcpy(this->apellido, auxCad);
            printf("Ingrese DNI: ");
            fflush(stdin);
            gets(auxCad);
            while(strlen(auxCad)>9)
            {
                printf("reingrese DNI. (max 9 digitos.)");
                gets(auxCad);
            }
            strcpy(this->DNI, auxCad);
            printf("Lider inmediato: ");
            fflush(stdin);
            gets(auxCad);
            while(strlen(auxCad)>30)
            {
                printf("reingrese nombre. (max 30.)");
                gets(auxCad);
            }
            strcpy(this->liderIn, auxCad);
            printf("Lider superior: ");
            fflush(stdin);
            gets(auxCad);
            while(strlen(auxCad)>30)
            {
                printf("reingrese nombre. (max 30.)");
                gets(auxCad);
            }
            strcpy(this->liderSup, auxCad);
            printf("Anexo: ");
            fflush(stdin);
            gets(auxCad);
            while(strlen(auxCad)>25)
            {
                printf("reingrese anexo. (max 20.)");
                gets(auxCad);
            }
            strcpy(this->anexo, auxCad);
            printf("1-Carpa    2-Habitacion: ");
            scanf("%d", &aux);
            while(aux < 1 && aux > 2)
            {
                printf("Error, ingrese opcion 1 o 2: ");
                scanf("%d", &aux);
            }
            this->car_hab = aux;

            this->isEmpty = 0;
            printf("\nAcampante agregado con exito.\n\n");
            system("pause");
            lista->add(lista, this);


        }
        else
        {
            printf("no se pudo agregar al acampante.");
        }
    }
    fwrite(this, sizeof(this), 1, archivo);
    fclose(archivo);
}