Errore Ftell dopo la prima chiamata a Fraw
Domanda
Quindi ho un programma molto semplice che legge i 3 primi byte di un file:
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 lo provo con un file di testo funziona bene:
position: 0 position: 1 char: 61 position: 2 char: 62 position: 3 char: 63.
Ma quando lo eseguo con un PNG, ad esempio, ottengo:
position: 0 position: 147 char:89 position: 148 char:50 position: 149 char:4E.
Si noti che i 3 primi byte del file sono effettivamente 89 50 4e ma non so da dove proviene il 147. Con un file BMP ottengo:
position: 0 position: -1 char:42 position: 0 char:4D position: 1 char:76.
Sai da dove vengono queste prima posizioni? Grazie mille per il tuo aiuto
Soluzione
È necessario aprire il file in modalità binaria:
fd = fopen("test.bmp", "rb");
.
Se si tenta di leggere un file binario come una bitmap in modalità testo, i byte corrispondenti a ritorni a carrello e linementi confondono le cose.
Altri suggerimenti
Si prega di guardare questa domanda leggere byte dal file BMP .
Sembra che il problema sia nella modalità di apertura.