Jump to content
thinkabout

Ler e Gravar em Ficheiro Binário - Listas Ligadas

Recommended Posts

thinkabout

Boas,

Estou a tentar gravar e recuperar informação de um ficheiro binário, mas estou a ter algumas problemas na recuperação da mesma.

 

void grava_lista_ligada(pspecies lista) {

    pno aux;

  FILE *pFile;
    int countanimais = 0;

    if ((pFile = fopen("ListaLigada.bin", "wb")) == NULL) {
        puts("Erro a abrir o ficheiro");
        return;
    } else {
        while (lista != NULL) {
            fwrite(lista, sizeof (species), 1, pFile);
            printf("Especie %s - Record\n", lista->especie);
            aux = lista->listadeanimais;
            while (aux != NULL) {
                fwrite(aux, sizeof (no), 1, pFile);
                printf("%s - Record ", aux->nome);
                aux = aux->prox;
            }
            puts("");
            lista = lista->prox;
          countanimais++;
        }
        fclose(pFile);
    }

    printf("Record species %d \n", countanimais);
}



O output do meu grave é o seguinte.

Especie Leao - Record
ZFixe - Record Simba - Record
Especie Pato - Record
Bicudo - Record
Record species 2

Parece-me bem.

Estou é a ter problemas quando estou a tentar recuperar a lista.
 

pspecies carrega_animais_binario(char * nomeFich, int total, pArea vector, pspecies lista) {

    FILE * pFile;
    pspecies novo;
    species bufferspecie;
    no bufferanimal;

    pFile = fopen(nomeFich, "rb");

    if (pFile != NULL) {
        while (fread(&bufferspecie, sizeof (species), 1, pFile) == 1) {
            printf("I just read the specie %s\n", bufferspecie.especie);
            while (fread(&bufferanimal, sizeof (no), 1, pFile) == 1) {
                printf("I just read the animal with the name %s\n", bufferanimal.nome);
            }
        }

      // TODO - Depois por em memória.
        
        fclose(pFile);
        return novo;

    }
}



O meu output tem erros.

I just read the specie Leao
I just read the animal with the name ZFixe
I just read the animal with the name Simba
I just read the animal with the name p■a

Ou seja ele só me le uma espécie devia ler duas e tenta ler mais animais do que existem, só existem 2 leões.
 

As minhas structs são as seguintes

typedef struct SPECIES species, *pspecies;
typedef struct ANIMAL no, *pno;

struct SPECIES {
    char especie[MAX];
    char idalphanumeric[MAX]; // Alphanumeric ID
    long int nranimais; // Se for 0 não aparece nas espécies existentes.   
    pno listadeanimais;
    pspecies prox;
};

struct ANIMAL {
    char especie[MAX]; // ID Unico
    int id; // id único por animal        
    char nome[MAX]; // Nome do animal
    int peso;
    char nomelocal[MAX]; // Area onde o animal se encontra.
    pno prox; // Ponteiro para proximo no da lista  

    // Ramos familaires 1 pai,1 mae, nFilhos ?
};

 

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

o output para o ficheiro tem de ser esse, ou pode ser algo mais simples e facil de trabalhar ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thinkabout
2 minutos atrás, HappyHippyHippo disse:

o output para o ficheiro tem de ser esse, ou pode ser algo mais simples e facil de trabalhar ?

Já o consegui meter a ler output correctamente.

Desde que consiga ler e recuperar a lista tanto faz como faço.

Agora quero é reconstruir a lista, mas quando faço display só me aparece lixo.

pspecies carrega_animais_binario(char * nomeFich, int total, pArea vector, pspecies lista) {

    FILE * pFile;

    pspecies novo;    
    species bufferspecie;

    no bufferanimal;
    pno newanimal;

    pFile = fopen(nomeFich, "rb");

    while (fread(&bufferspecie, sizeof (species), 1, pFile) == 1) {

        if ((novo = malloc(sizeof (species))) == NULL) {
            printf("Error on the the memory to the new animal, please check the file.\n");
            fclose(pFile);
            return lista;
        }

        novo->prox = lista;
        lista = novo;

        printf("I just read the specie %s\n", bufferspecie.especie);
        for (int i = 0; i < bufferspecie.nranimais; i++) {
            if (fread(&bufferanimal, sizeof (no), 1, pFile) == 1) {
                printf("I just read the animal with the name %s\n", bufferanimal.nome);

                if ((newanimal = malloc(sizeof (no))) == NULL) {
                    printf("Error on the the memory to the new animal, please check the file.\n");
                    fclose(pFile);
                    return lista;
                }

                newanimal->prox = lista->listadeanimais;
                lista->listadeanimais = newanimal;
            }
        }
    }

    fclose(pFile);
    return lista;

}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.