所以,我试图使用fread和structs读取BMP图像。我创建了以下结构来读取标题
struct head{
char sigBM[2];//This will get the 'B' and 'M' chars
int fileSize;
int reserved;
int offset
...
};
在我使用的主要功能中
fread(pointerToStruct,sizeof(struct head),1,image);
我得到了一些奇怪的结果。但后来我决定从结构中获取char sigBM [2]并用不同的fread读取它。类似的东西:
char sigBM[2];
struct head *p = malloc(sizeof(struct head));/*
Without the char sigBM[2]
*/
fread(sigBM,sizeof(char),2,image);
fread(p,sizeof(struct head),1,image);
它有效!
我已经开始工作,我只是想知道为什么它会像那样工作
答案 0 :(得分:2)
您的数据似乎没有填充就写入磁盘。那是;整数fileSize
直接来自两个字符。这通常不是结构保存在内存中的方式。
的大小
struct head{
char sigBM[2];//This will get the 'B' and 'M' chars
// two padding bytes hide here
int fileSize;
}
我的机器上是8。如你所料,不是2 + 4。如果在同一平台上使用相同的编译器选项进行读/写,则可以正确读取结构。如果没有,您需要控制这些细节。
大多数架构需要(或更喜欢)数字类型从两个特定乘数开始[例如类型本身的大小]。
答案 1 :(得分:0)
在带有
的16位int
,32位long
世界中
struct head{
char sigBM[2];
long fileSize;
long reserved;
long offset
...
};
一切顺利。但是尝试阅读带有填充的结构(字段之间的额外空间)会导致OP的问题。
解决方案是一次一个地读取每个字段 - 就像OP的方法一样。另一种方法是使用编译器特定选项或关键字来“打包”结构。
通常,在给定C变量int
大小的情况下,最好将这些字段视为int8_t
,int16_t
,int32_t
而不是char
,{ {1}}等等。
答案 2 :(得分:-1)
the OP has workable idea. It does need some extension.
Of some note is that several fields within the .bmp file
have non-fixed offsets from the start of the file.
so a single struct will not properly handle the whole file
Of critical interest is the number of 'special' color entries
as that changes the offsets for all the rest of the file.
the actual image, depending on the pixel width and the image width
can have from 0 to 3 bytes of filler for each pixel line of the image
certain fields are optional in the second section of the file.
and some fields within the first section of the file contain
offsets into the file for other key areas.
in general, it is best to treat the file as a long string of bytes
and use offsets (and field length) to access specific fields
this has been demonstrated, with full C code,
on several answers in stackoverflow.com
suggest performing a search.