Problem reading binary files!

Asked

Viewed 73 times

0

I am making a method for a C code that adds an addition to the value of all the books recorded in a binary file, however ... when I have more than 2 records, all from, ie the record 3,4.5 ... are rewritten with record values 2 someone can 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");

1 answer

1

I couldn’t get the code you wrote to run, as it needs other functions, as well as a preexisting "books.dat" file; but if records 3 onwards are being overwritten with record 2 information, the probability is that the fread() is failing from there, but you’re not checking the return value to check that the read worked...

Therefore, I suggest replacing the fread() by 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));

Additionally, you might 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 the fread() and of fwrite().

Browser other questions tagged

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