Ошибка FTELL после первого звонка для Fread
Вопрос
Так что у меня очень простая программа, которая читает 3 первых байта файла:
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); }.
Когда я попробую его с текстовым файлом, он работает нормально:
position: 0 position: 1 char: 61 position: 2 char: 62 position: 3 char: 63.
Но когда я бегу с PNG, например, я получаю:
position: 0 position: 147 char:89 position: 148 char:50 position: 149 char:4E.
Обратите внимание, что 3 первых байта файла действительно 89 50 4e, но я не знаю, откуда приходит 147. С помощью файла BMP я получаю:
position: 0 position: -1 char:42 position: 0 char:4D position: 1 char:76.
Вы знаете, откуда приходят эти первые позиции? Большое спасибо за вашу помощь
Решение
Вам нужно открыть файл в двоичном режиме:
fd = fopen("test.bmp", "rb");
.
Если вы попытаетесь прочитать двоичный файл, например, растровое изображение в текстовом режиме, байты, соответствующие возврату каретки, и линейные преобразования путают вещи.
Другие советы
Пожалуйста, посмотрите на этот вопрос Bytes чтения из файла BMP .
Похоже, проблема в режиме открытия его.