Я работаю над 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() должен читать (в данном случае) два символа данные, откуда возникает этот дополнительный символ?
Вы сильно смешиваете c и c++, я думаю, что это половина причины, почему вы попали в ошибку на первом месте.
Теперь в c
строках называются строки символов с нулевым символом. Нулевой символ \0
является концом строкового разделителя. Что вы делаете, так это чтение двух байтов в headerField
. Поэтому в памяти это выглядит так:
| B | M | мусор | мусор | мусор |
str
и другие процедуры ожидают, что строки char*
будут иметь \0
в конце. Таким образом, strcmp
, и печать не останавливается после M
а запускается в дикую природу. Строка 2-символьного c-стиля должна занимать 3 байта и выглядеть так:
| B | M | 0 | мусор | мусор |
Как вы это делаете, я оставляю вас.
Я бы переписал код в собственный c++ лично.
"Дополнительный мусор" уже есть в памяти.
fread() делает именно то, что вы говорите. Он читает 2 символа. C и C++ используют строки с нулевым завершающим символом. cout будет печатать все, что находится в буфере, пока не достигнет нулевого терминатора.
Вы должны создать строку длиной более 2, и вы должны установить нулевой символ.
headerfield
не имеет явного нулевого завершения.