Struct with pointer and allocation

1

I can not use fscanf in a structure, I have already allocated 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;
}
    
asked by anonymous 27.04.2014 / 20:30

2 answers

2

After allocating memory for video , you have to allocate video->cliente , 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 ...
    }
    
27.04.2014 / 20:38
0

There is an error on the line:

  

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

If regE contains the number of records, then a () is missing to make the multiplication give the expected result, allocating the required amount of memory:

video=(Emprestimo*)malloc((regE+20)*sizeof(Emprestimo));
    
28.04.2014 / 16:59