Чтение заголовка файла BMP с помощью fread ()

0

Я работаю над Linux, пытаясь загрузить заголовок BMP. Я просмотрел заголовок и должен получить "BM" для первых двух символов файла. Код, который я использовал:

FILE* fp = fopen(filename, "r");
if(!fp)
{
    std::cout << "Unable to open file : " << filename << std::endl;
    return NULL;
}

char* headerField = new char[2];
fread(headerField, 2, sizeof(char), fp);
std::cout << headerField << std::endl;

if(strcmp(headerField, "BM")){
    delete [] headerField;
    std::cout << "File is not a bitmap" << std::endl;
    fclose(fp);
    return NULL;
}
else{
    std::cout << "Well done!" << std::endl;
}

Результат, который я получаю, - это BM, за которым следует случайный дополнительный символ "BM7", "BMF", "BM *"... Как я понимаю, fread() должен читать (в данном случае) два символа данные, откуда возникает этот дополнительный символ?

  • 2
    Содержимое поля headerfield не имеет явного нулевого завершения.
  • 0
    Вам не нужно динамически выделять два символа. И почему вы используете старые функции CI / O в C ++?
Показать ещё 3 комментария
Теги:
file
bmp

2 ответа

2
Лучший ответ

Вы сильно смешиваете c и c++, я думаю, что это половина причины, почему вы попали в ошибку на первом месте.

Теперь в c строках называются строки символов с нулевым символом. Нулевой символ \0 является концом строкового разделителя. Что вы делаете, так это чтение двух байтов в headerField. Поэтому в памяти это выглядит так:

| B | M | мусор | мусор | мусор |

str и другие процедуры ожидают, что строки char* будут иметь \0 в конце. Таким образом, strcmp, и печать не останавливается после M а запускается в дикую природу. Строка 2-символьного c-стиля должна занимать 3 байта и выглядеть так:

| B | M | 0 | мусор | мусор |

Как вы это делаете, я оставляю вас.

Я бы переписал код в собственный c++ лично.

  • 0
    +1 несмотря на пропаганду анти-С stdio: P
  • 0
    Ну, есть проблема, и объяснение ей, и ответ есть ответ, независимо от моих собственных предпочтений. Я не тот, кто делает обзор кода =).
Показать ещё 2 комментария
1

"Дополнительный мусор" уже есть в памяти.

fread() делает именно то, что вы говорите. Он читает 2 символа. C и C++ используют строки с нулевым завершающим символом. cout будет печатать все, что находится в буфере, пока не достигнет нулевого терминатора.

Вы должны создать строку длиной более 2, и вы должны установить нулевой символ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню