Files For Structs/C Pointers

Asked

Viewed 518 times

0

I have this little program and I’m able to save, and upload from the file to struct(not perfectly).

The error is as follows: after loading the file to struct, if in the function I load the printf it will correctly print all struct files that were previously in the file, however, if I do the same printf in another function, or even try to save in the file, it puts random values in memory, would like to know where was my mistake.

#include <stdio.h>
#include <stdlib.h>
struct produto{
    char nome[40];
    int cod_prod;
    float precoVenda;


};

const CRESCE = 64;
int nroProdutos, capacidadeProds;
struct produto *produto;
int novos_prods;




void CarregarProdutos(){
    FILE *arq = fopen("produtos.txt","r+");
    fscanf(arq,"%d", &nroProdutos);
    capacidadeProds =nroProdutos+CRESCE;
    produto = malloc(capacidadeProds*sizeof(struct produto));
    int i;
    for (i = 0; i < nroProdutos; i++){
        fscanf(arq,"%s", produto[i].nome );
        fscanf(arq,"%d", &(produto[i]).cod_prod );
        fscanf(arq,"%f", &produto[i].precoVenda);
        // se eu aplicar o printf aqui dará tudo certo..
    }



    fclose(arq);
}
void SalvarProdutos(){
    FILE *arq = fopen("produtos.txt","w");
    int i;
    fprintf(arq,"%d\n",novos_prods);
    for (i = 0; i < novos_prods; i++){
        fprintf(arq,"%s\n", produto[i].nome );
        fprintf(arq,"%d\n",  produto[i].cod_prod );
        fprintf(arq,"%f\n", produto[i].precoVenda);
//quando vou salvar pros arquivos os valores saem aleatorios.
//(sei que o erro está na forma que eu leio do arquivo pra memoria)
 }
    fclose(arq);
}
void CadastrarProdutos(){//essa função cadrastra produtos novos a partir 
dos produtos ja existentes, para que não haja sobreposição;
     capacidadeProds =nroProdutos+CRESCE;
    produto = malloc(capacidadeProds*sizeof(struct produto));
    int i = nroProdutos;// essa variavel é a variavel q nao sobrepoe o estoque caso seja diferente de 0
    char x;

    do
    {
        printf("Digite o nome do produto\n");
        fflush(stdin);
        scanf("%s", produto[i].nome);
        produto[i].cod_prod = i;
        printf("Digite o preco de compra do produto\n");
        fflush(stdin);
        scanf("%f", &produto[i].precoVenda);
        printf("deseja cadastrar um novo produto?\n");
        printf("digite n para sair\n");
        printf("digite qualquer tecla para cadastrar novos produtos\n");
        fflush(stdin);
        scanf("%c",&x);
            i++;
    } while(x != 'n');
        novos_prods = i;
   // chame aqui a proxima funçao, no caso a função menu
   //nesse caso ela esta chamando a função salvar pq aqui esta sem o menu e etc.
   SalvarProdutos();
}

int main()
{
    CarregarProdutos();
    CadastrarProdutos();
}

The error is probably in the form that is loaded from the file to memory. I would appreciate anyone who would help, probably in the form in which I call from the archive to struct, thank you!

  • How will the CarregarProdutos() the first time the program runs if the file produtos.txt does not exist ? The CadastrarProdutos() also does not guarantee that it does not register more records than were allocated in the malloc for in the do while was not considered the i as exit point also

1 answer

0


I don’t currently have a C compiler, but from what I saw, the problem was how you were accessing the struct. When Random variables appear it means that you were accessing something other than your struct.

void CarregarProdutos(){
FILE *arq = fopen("produtos.txt","r+");
fscanf(arq,"%d", &nroProdutos);
capacidadeProds =nroProdutos+CRESCE;
produto = malloc(capacidadeProds*sizeof(struct produto));
int i;
for (i = 0; i < nroProdutos; i++){
    fscanf(arq,"%s", &(produto+i).nome );
    fscanf(arq,"%d", &(produto+i).cod_prod );
    fscanf(arq,"%f", &(produto+i).precoVenda);
    // se eu aplicar o printf aqui dará tudo certo..
}



fclose(arq);
}
void SalvarProdutos(){
FILE *arq = fopen("produtos.txt","w");
int i;
fprintf(arq,"%d\n",novos_prods);
for (i = 0; i < novos_prods; i++){
    fprintf(arq,"%s\n", &(produto+i).nome );
    fprintf(arq,"%d\n",  &(produto+i).cod_prod );
    fprintf(arq,"%f\n", &(produto+i).precoVenda);
//quando vou salvar pros arquivos os valores saem aleatorios.
(sei que o erro está na forma que eu leio do arquivo pra memoria)
}
fclose(arq);
}
  • @solved! just did what the friend above said and also removed that part of the registersProducts = capabilityProds =nroProducts+CRESCE; product = malloc(capabiliteProds*sizeof(struct product))

Browser other questions tagged

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