簡體   English   中英

用fread()讀取BMP的文件頭

[英]Reading Fileheader of a BMP with fread()

我正在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 ++,我認為這是您首先進入bug的一半原因。

現在,由於某種原因,在c字符串中稱為以null終止的字符串。 空字符\\0是字符串定界符的結尾。 您正在做的是將兩個字節讀取到headerField 因此在內存中看起來像:

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

str家族和其他例程希望char*字符串的末尾有\\0 因此, strcmp和打印不會在M之后停止,而是會陷入困境。 正確的2個字符的c樣式字符串應占用3個字節,如下所示:

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

你如何做到的,我取決於你。

我會親自將代碼重寫為適當的c ++。

內存中已經有“額外的垃圾”。

fread()完全按照您所說的進行。 它讀取2個字符。 C和C ++使用以null終止的char字符串。 cout將打印緩沖區中的所有內容,直到到達空終止符為止。

您應該創建一個長於2的字符串,並應設置一個空字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM