2010-07-09 4 views
1

Так что у меня очень простая программа, которая считывает первые 3 байта файла:ftell ошибка после первого вызова FREAD

 
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 

Вы знаете, где эти первые позиции взялись? Большое спасибо за вашу помощь

ответ

3

Вам нужно открыть файл в двоичном режиме:

fd = fopen("test.bmp", "rb"); 

Если вы попытаетесь прочитать двоичный файл, как растровое изображение в текстовом режиме, байты, соответствующий возврат каретки и перевод linefeeds путают вещи.

+0

Благодарим вас за быстрый ответ! – bAp

Смежные вопросы