ftell de erro após a primeira chamada para fread
Pergunta
Então, eu tenho um programa muito simples que lê os 3 primeiros bytes de um arquivo:
int main(void) { FILE *fd = NULL; int i; unsigned char test = 0; fd = fopen("test.bmp", "r"); printf("position: %ld\n", ftell(fd)); for (i=0; i<3; i++) { fread(&test, sizeof (unsigned char), 1, fd); printf("position: %ld char:%X\n", ftell(fd), test); } return (0); }
Quando eu experimentá-lo com um arquivo de texto, ele funciona bem:
position: 0 position: 1 char: 61 position: 2 char: 62 position: 3 char: 63
mas quando eu executar com um PNG, por exemplo, eu recebo:
position: 0 position: 147 char:89 position: 148 char:50 position: 149 char:4E
Note que os 3 primeiros bytes do arquivo são, de fato, 89 50 4E, mas eu não sei onde 147 vem.Com um arquivo bmp eu recebo:
position: 0 position: -1 char:42 position: 0 char:4D position: 1 char:76
Você sabe onde estas primeiras posições vêm?Muito obrigado por sua ajuda
Solução
Você precisa abrir o arquivo em modo binário:
fd = fopen("test.bmp", "rb");
Se você tentar ler um arquivo binário como um mapa de bits no modo de texto, os bytes correspondentes ao retorno de carro e alimentação de linha confundir as coisas.
Outras dicas
Por favor, olhe esta pergunta A leitura de bytes do arquivo bmp.
Parece que o problema está no modo de abri-lo.