为什么fread()不进入我的struct工作?

时间:2013-06-29 03:14:52

标签: c

我有以下代码从文件读取到结构和arrary中。当我尝试在结构中打印数据时,它并不是我所期望的。数组打印出预期的内容,即文件中的前两个字符。

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]);
}

2 个答案:

答案 0 :(得分:0)

当您执行第一个fread时,会提前读取文件的位置,因此第二个fread将读取接下来的两个字节。在第二次阅读之前,您需要添加另一个fseek

答案 1 :(得分:0)

首先,char magic[1]为您提供一个字节,而不是两个。读取两个字节是肯定的禁忌。

其次,后续fread将尝试读取文件中的 next 两个字节而不是前两个字节,因为第一个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]);