Error de FTELL después de la primera llamada para congrarse
Pregunta
Así que tengo un programa muy simple que lee los 3 primeros bytes de un archivo:
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); }
Cuando lo intento con un archivo de texto, funciona bien:
position: 0 position: 1 char: 61 position: 2 char: 62 position: 3 char: 63
Pero cuando lo ejecuto con un PNG, por ejemplo, obtengo:
position: 0 position: 147 char:89 position: 148 char:50 position: 149 char:4E
Tenga en cuenta que los 3 primeros bytes del archivo son de hecho 89 50 4e, pero no sé de dónde proviene el 147. Con un archivo BMP que recibo:
position: 0 position: -1 char:42 position: 0 char:4D position: 1 char:76
¿Sabes de dónde vienen estas primeras posiciones? Muchas gracias por tu ayuda
Solución
Debe abrir el archivo en modo binario:
fd = fopen("test.bmp", "rb");
Si intenta leer un archivo binario como un mapa de bits en el modo de texto, los bytes correspondientes a los retornos de carro y las líneas de línea confunden las cosas.
Otros consejos
Consulte esta pregunta Lectura de bytes de BMP .
Parece que el problema está en el modo de abrirlo.