Problem reading binary files!

0

I'm making a method for a code in C that adds an addition to the value of all books written to a binary file, however ... when I have more than 2 records, all on, ie the record 3,4 , 5 ... are rewritten with registry values 2 can someone help me? {

FILE *fptr;
float acrescimo;
struct reg_livro livro;
int contadorLivros = 0;

if((fptr = fopen("livros.dat","rb+"))==NULL){
    printf("Erro ao abrir o arquivo \n");
    return;
}

fseek(fptr,0,2);
int tamanhoArq = ftell(fptr);
int qtdLivros = tamanhoArq/sizeof(livro);

printf("Quantidade de livros %d\n", qtdLivros);
printf("Tamanho do arquivo %d\n",tamanhoArq );
rewind(fptr);
printf("Posicao atual %d\n",ftell(fptr) );

printf("Informe a porcentagem de acrescimo no preco de cada livro\n");
fflush(stdin);scanf("%f",&acrescimo);

while(contadorLivros<qtdLivros)
{   
    fread(&livro,sizeof(livro),1,fptr);
    printf("\n Ponteiro Inicial %d",ftell(fptr));
    float valorAcrescimo = livro.preco*(acrescimo/100);
    printf("\n Acrescimo: %f\n", valorAcrescimo);
    printf("\n Livro antes da alteracao: %f ",livro.preco);
    livro.preco = livro.preco + valorAcrescimo;
    printf("\n Livro depois da alteracao: %f ",livro.preco);

    fseek(fptr,-sizeof(livro),1);
    fwrite(&livro,sizeof(livro),1,fptr);
    printf("\n Ponteiro Final %d",ftell(fptr));
    contadorLivros++;

}

fclose(fptr);
printf("\n Acrescimo inserido com sucesso!!\n");
    
asked by anonymous 13.03.2017 / 15:37

1 answer

0

I could not put the code you wrote to run, since it needs other functions as well as a pre-existing "books.dat" file; but if records 3 onwards are being overwritten with information from record 2, the probability is that fread() is failing from there, but you're not checking the return value to make sure that the reading worked ...

So, I suggest replacing fread() with the following:

while (contadorLivros < qtdLivros) {
    int rc = fread(&livro, sizeof (livro), 1, fptr);
    if (rc < 1) { // Não consegui ler ao menos um elemento
        fprintf(stderr, "Erro ao ler registro nº %d: ferror() retornou %d\n", contadorLivros + 1, ferror(fptr));
    }
    printf("\n Ponteiro Inicial %d",ftell(fptr));

In addition, you may want to move the file pointer to the absolute value of the record instead of the relative value using fseek(fptr, contadorLivros * sizeof (livro), 0); before fread() and fwrite() .

    
15.03.2017 / 18:36