2015-11-23 95 views
0

我編寫了一個程序來讀取BMP文件頭文件。 代碼如下:在C中讀取bmp頭文件

#include <stdio.h> 

typedef unsigned short WORD; 
typedef unsigned short BYTE; 
typedef unsigned int DWORD; 

typedef struct _WinBMPFileHeader { 
    WORD FileType; 
    DWORD FileSize; 
    WORD Reserved1; 
    WORD Reserved2; 
    DWORD BitmapOffset; 
} WINBMPFILEHEADER; 

int main(int argc, char* argv[]) { 

    WINBMPFILEHEADER *header = NULL; 
    FILE *fptr; 
    size_t bytes_read; 

    if (argc == 2) { 
    fptr = fopen(argv[1], "r"); 
    bytes_read = fread(header, sizeof(WINBMPFILEHEADER), 1, fptr); 
    } 
    else 
    printf("The number of parameters is wrong.\n"); 

    return 0; 

} 

當我運行程序我有,因爲FREAD的分段錯誤。 這個故障的原因是什麼?

+0

你簡單地認爲該文件得到了正確打開。永遠不要以外部資源取得成功。如果fopen()失敗,它將返回null。如果您嘗試將該空值用作文件指針,則會出現分段錯誤。 –

+0

'fread'讀取一個二進制流,但你的fopen確實表示r''而不是'rb''。另外,您在嘗試打開文件後不檢查錯誤,因此您如何知道文件實際打開成功並準備好讀取? – ray

+0

也許這是一個dublicate:http://stackoverflow.com/questions/19745658/c-reading-bmp-files – PanGalactic

回答

1

看這個

WINBMPFILEHEADER *header = NULL; 
... 
bytes_read = fread(header, sizeof(WINBMPFILEHEADER), 1, fptr); 

段故障是因爲你是路過NULL的功能。您必須爲header分配內存,也許

header = malloc (sizeof(WINBMPFILEHEADER)); 

你也需要聲明的錯誤作爲一個單獨的問題:

typedef unsigned short BYTE; 

應該

typedef unsigned char BYTE; 

最後,你必須確保你不」 t有endian問題與任何2或4(我不認爲有任何8)字節字段,有點偏題。

+0

謝謝,現在它工作。我有一個關於宣言的問題。爲什麼是「typedef unsigned short BYTE;」正確的聲明? – Saverio

+0

如果這個答案是正確的,請「接受」它。至於你的評論問題,這是一個「錯字」或「複製/麪食」的錯誤。你爲什麼要定義兩種類型相同?看看上面的WORD'typedef'。 BYTE永遠不會「短」。 –

+0

我想你的意思是「爲什麼'typedef無符號短BYTE;'錯誤*聲明?」 –

1

試試這個,它是一個sipmle一個我用

synHead reader(FILE* img) { 
synHead info; 
fseek(img, 10, 0); 
fread(&info.D, 1, 4, img); 

fseek(img, 18, 0); 
fread(&info.W, 1, 4, img); 

fseek(img, 22, 0); 
fread(&info.H, 1, 4, img); 

return(info);