2016-12-31 4 views
0
#include <stdio.h> 


int main() 
{ 
    int i,j; 
    FILE *f; 
    f=fopen("./pathto/sth.bmp","rb"); 
    fread(&i,1, 1, f); 
    printf("%d ",i); 
    fread(&j,1, 1, f); 
    printf("%d ",j); 

    return 0; 
} 

Я хочу прочитать первые 2 значения из файла BMP. Я знаю, что их 66 и 77. Проблема в том, что если я прочитаю только первое значение, переменная «i» станет равной 66, что хорошо. Но если я прочитаю второе значение, как «j», тогда «j» станет 77, что хорошо, а «i» принимает случайное значение примерно как 196540, и я не понимаю, почему. Поэтому, если я прочитаю первое значение, все будет в порядке. Если я прочитал первые 2 значения, последнее значение будет хорошим, но первое будет изменено, оно станет случайным, например, 196540.Чтение из выпуска двоичного файла

+2

Почему вы используете переменные 'int', когда вы читаете значения размера байта? Что такое 'sizeof (int)' на платформе, которую вы используете? –

+2

Я подозреваю, что чтение 'unsigned char sig [2]' через 'fread (sig, sizeof (sig), 1, f)' будет ближе к тому, что вам кажется, хотя вы, вероятно, захотите потратить время на чтение [ весь заголовок] (https://en.wikipedia.org/wiki/BMP_file_format#Bitmap_file_header). – WhozCraig

+0

необходимо проверить возвращаемые значения (а не значения параметров из вызовов 'fopen()' и 'fread()', чтобы убедиться, что операция выполнена успешно. – user3629249

ответ

3

Когда я пытаюсь выполнить вашу программу, я получаю результаты мусора для обеих переменных.

Проблема в том, что вы используете неправильные переменные типа. Вы читаете один байт из файла, но вы читаете его в переменной int, которая представляет собой несколько байтов. Таким образом, это объединяет один байт из файла с любыми случайными данными, находящимися в начальных значениях переменных.

Объявление их char вместо int.

#include <stdio.h> 

int main() 
{ 
    char i,j; 
    FILE *f; 
    f=fopen("sth.bmp","rb"); 
    fread(&i,1, 1, f); 
    printf("%d ",i); 
    fread(&j,1, 1, f); 
    printf("%d\n",j); 

    return 0; 
} 
+0

Большое спасибо, это была проблема, я попробовал что-то аналогично ранее, но я также изменял аргументы printf (% s вместо% d), почему это не так? –

+0

'% s' предназначен для печати строки, которая представляет собой массив символов' char', заканчивающийся нулевым байтом . 'i' - всего лишь один символ. Если вы хотите увидеть символ вместо кода ASCII, используйте'% c'. – Barmar

+0

@LazuRazvan: обратите внимание, что распечатка символа вместо его десятичного значения полезна только для самого первые 2 байта в BMP-файле. Остальные - все двоичные данные. – usr2564301

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