C 为什么';t fread()进入我的结构工作?
我有以下代码,可以将文件读入结构和数组。当我试图打印结构中的数据时,这不是我所期望的。数组将打印预期的内容,即文件中的前两个字符C 为什么';t fread()进入我的结构工作?,c,C,我有以下代码,可以将文件读入结构和数组。当我试图打印结构中的数据时,这不是我所期望的。数组将打印预期的内容,即文件中的前两个字符 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).
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]);
}
当您执行第一个
fread
时,您将前进文件的读取位置,因此第二个fread
将读取接下来的两个字节。在第二次读取之前,您需要添加另一个fseek
。首先,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]);
编译器可能会将缓冲区填充到4/8/16字节,所以他很幸运,但这是不可靠的行为。