用fread()读取BMP的Fileheader

时间:2014-10-24 11:44:54

标签: c++ linux file bmp

我在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 个答案:

答案 0 :(得分:2)

你正在大量混合使用c和c ++,我认为这是你在第一时间陷入错误的一半原因。

现在,在c字符串中出于某种原因被称为以空字符结尾的字符串。空字符\0是字符串分隔符的结尾。你正在做的是将两个字节读入headerField。所以在内存中它看起来像:

  

| B | M |垃圾|垃圾|垃圾|

str系列和其他例程期望char*字符串最后有\0。所以strcmp,打印不会在M之后停止,而是会遇到狂野。一个正确的2字符c样式字符串应占用3个字节,如下所示:

  

| B | M | 0 |垃圾|垃圾|

如何实现这一目标我留给你。

我会将代码重写为适当的c ++。

答案 1 :(得分:1)

&#34;额外的垃圾&#34;已经存在了。

fread()正是你告诉它的。它读取2个字符。 C和C ++使用null终止的char字符串。 cout将打印缓冲区中的任何内容,直到它到达空终止符。

您应该创建一个长于2的字符串,并且应该设置一个空字符。