Struct with pointer and allocation

Asked

Viewed 580 times

1

I can’t use the fscanf in a structure, I have already allotted the structures.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Cliente
{
    int numero;
    char *nome;
};
struct Filme
{
    int numero;
    char * nome;
};
struct Data
{
    int dia;
    int mes;
    int ano;
};
struct Emprestimo
{
    int numero;
    int ativo;
    Cliente *cliente;
    Filme *filme;
    Data *emprestimo;
    Data *devolucao;
};

void verifica_erro(FILE *arquivo)  //verifica se deu erro ao abrir o arquivo
{
    if(arquivo==NULL)
    {
        printf("Erro ao abrir o arquivo!");
        exit(0);
    }
}
void carrega_empre(Emprestimo *video) //carrega na memoria os dados do cliente
{
    FILE *arquivo;
    arquivo=fopen("emprestimos.txt","rt");
    verifica_erro(arquivo);
    int cont=0;
    while(!feof(arquivo))
    {
        fscanf(arquivo,"%d %d %d" ,&video[cont].numero,&video[cont].cliente->numero,&video[cont].filme->numero);
        fscanf(arquivo,"%d %d %d %d " ,&video[cont].emprestimo->dia,&video[cont].emprestimo->mes,&video[cont].emprestimo->ano,&video[cont].ativo);
        fscanf(arquivo,"%d %d %d",&video[cont].devolucao->dia,&video[cont].devolucao->mes,&video[cont].devolucao->ano);
        cont++;
        cont++;
    }
    fclose(arquivo);
}
int conta_registros(char *caminho) //conta quatos registros tem no txt para alocar na         strutura
{
    FILE *arquivo;
    char caracter;
    int linhas=0;
    arquivo=fopen(caminho,"rt");
    while((caracter = fgetc(arquivo)) != EOF)
    {
        if(caracter == '\n')  //cada linha eh um registro
        {
            linhas++;
        }
    }
    fclose(arquivo);
   return linhas;
}
int main()
{
    int regE;
    Emprestimo *video;
    regE=conta_registros("emprestimos.txt");
    video=(Emprestimo*)malloc(regE+20*sizeof(Emprestimo)); 

    carrega_empre(video);
    printf("acabo\n");
    scanf("%*c");
    return 0;
}
  • 1

    Post a template/example of the file you are trying to read.

2 answers

2

After allocating memory to video, you have to allocate to video->cliente, for video->filme, video->emprestimo, and video->devolucao.

int main()
{
    Emprestimo *video;
    video = malloc(regE * sizeof *video); /* falta validacao de erro */
    for (int k = 0; k < regE; k++) {
        video->cliente = malloc(sizeof *video->cliente); /* falta validacao de erro */
        video->filme = malloc(sizeof *video->filme); /* falta validacao de erro */
        // etc ...
    }
  • then the same so will not go expensive! can try with the code there

0

There is an error on the line:

video=(Emprestimo*)malloc(rege+20*sizeof(Emprestimo));

If regE contains the amount of records, so a couple of () to make the multiplication give the expected result, allocating the amount of memory needed:

video=(Emprestimo*)malloc((regE+20)*sizeof(Emprestimo));

Browser other questions tagged

You are not signed in. Login or sign up in order to post.