2013-06-29 52 views
0

我有下面的代碼,從文件讀取到一個結構和一個arrary。當我嘗試在結構中打印數據時,它不是我所期望的。該數組打印出預期的內容,即文件中的前兩個字符。爲什麼fread()進入我的結構工作?

typedef struct __attribute__((packed)){ 
     uint8_t magic[2]; /* the magic number used to identify the BMP file: 
        0x42 0x4D (Hex code points for B and M). 
        The following entries are possible: 
        BM - Windows 3.1x, 95, NT, ... etc 
        BA - OS/2 Bitmap Array 
        CI - OS/2 Color Icon 
        CP - OS/2 Color Pointer 
        IC - OS/2 Icon 
        PT - OS/2 Pointer. */ 
} bmp_header_t; 


bool 
bmp_get_header_from_file(FILE *fp, bmpfile_t *bmp) 
{ 
     fseek(fp, 0L, SEEK_SET); 
     char magic[1]; 

     fread(magic, 1, 2, fp); 
     printf("magic is: %c, %c\n", magic[0], magic[1]); 

     fread(&bmp->header, 1, 2, fp); 
     printf("magic is: %c, %c\n", bmp->header.magic[0], bmp->header.magic[1]); 
} 

回答

0

當你做的第一fread,你預先將文件的讀取位置,所以第二fread將讀取接下來的兩個字節。在第二次閱讀之前,您需要添加另一個fseek

0

首先,char magic[1]給你一個字節,而不是兩個。讀入兩個字節是一個明確的禁忌。

其次,後續fread將試圖讀取該文件,而不是前兩個在下一個兩個字節,因爲第一fread擁有先進的文件指針。

像這樣的事情會更好:

char magic[2]; 

    fseek(fp, 0L, SEEK_SET); 
    fread(magic, 1, 2, fp); 
    printf("magic is: %c, %c\n", magic[0], magic[1]); 

    fseek(fp, 0L, SEEK_SET); 
    fread(&bmp->header, 1, 2, fp); 
    printf("magic is: %c, %c\n", bmp->header.magic[0], bmp->header.magic[1]); 
+0

編譯器可能填充該緩衝區4/8/16字節,所以他很幸運,不過啊,這是不可靠的行爲。 –

相關問題