使用fread()读取BMP的文件头

Reading Fileheader of a BMP with fread()

本文关键字:文件 BMP 读取 fread 使用      更新时间:2023-10-16

我在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中,字符串被称为以null结尾的字符串是有原因的。空字符是字符串结束分隔符。您正在做的是向headerField中读取两个字节。所以在记忆中它看起来像:

|B|M|垃圾

str家族和其他例程期望char*字符串在末尾具有。因此,strcmp和打印并没有在M之后停止,而是运行到野外。一个合适的2个字符的c样式字符串应该占用3个字节,看起来像:

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

你如何做到这一点,我交给你决定。

我会亲自把代码重写成一个合适的c++。

"额外垃圾"已经存在于内存中。

fread()完全按照你说的做。它读取2个字符。C和C++使用以null结尾的字符字符串。cout将打印缓冲区中的任何内容,直到它到达一个null终止符。

您应该创建一个大于2的字符串,并设置一个null字符。