[英]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.