2013-03-02 47 views
0

我试图读取使用的fread文件的码流为如何防止类型转换过程中的数据丢失?

fread(buff, buffSize, 1, fp); 

buff is the buffer to which i am readingbuffSize is the size of buffer,和fp is the file pointer我正在阅读。 将数据读取到缓冲区后,我尝试将缓冲区内容转换为另一个结构变量。结构形式

typedef struct data 
{ 
    char id; 
    short value1; 
    short value2; 
    .... 
}data; 

我所做的就是

data* var; 
var = (data*)buff; 

然后我试图访问该结构中的变量,如果比特流是像00 b0 11 c1 00如果是这样的情况下, var->id0x00。和var->value10xb011var->value20xc100

但是我所得到的是

var->id = 0x00; 
var->value1 = 0x11c1; 
... 

它为什么我没有收到预期? 当我将第一个参数类型改为short时,值得到var->id was 0x00b0。 有没有什么像最小访问量是2 Bytes? 如何解决这个问题? 我只想读第一个字节到var->id字段。

回答

2

发生这种情况是因为在value1之前有一个padding field,用于对齐。如果你想摆脱它,指示你的编译器“打包”结构。每个编译器有不同的语法。例如,对gcc你会说:

struct __attribute__ ((__packed__)) data { 
    /* ... */ 
}; 
+0

谢谢cnicutar ....这真的工作 – jithin 2013-03-02 21:35:16