fread fseek只有C中的struct成员

问题描述:

在C中,我试图选择结构的特定成员并将其打印出来。我想知道,这种操作的建议格式是什么?我尝试了几乎所有我能想到的。我似乎无法将其限制为该结构的特定chunk成员。fread fseek只有C中的struct成员

fseek(in, sizeof(d.contents.datas.chunk), SEEK_SET); 
fread(&ch, 1, 1, in); 
fprintf(out, "%02x", (int)(ch & 0x00FF)); 

看来我可以得到所有的结构数据,或只有一个字符。出于某种原因,数据也不是正确的,例如bytes应该是实际的bytes,但它的出现为1。很显然,这个结构的数据打印方式有些问题。这可能是大endian vs小endian吗?我知道我正在访问的文件是big endian。

的结构林访问如下:

struct chunkInfo 
{ 
    int chunkInformation; 
    int bytes; 

    union 
    { 
     struct 
     { 
      long size;  
      char chunk[1];  
     } datas;     
    } contents;     
}; 
+1

#pragma pack(忽略endian) –

+0

是的,如果你在一个intel架构上并且接收到big endian的数据,你需要转换它。查看例如'hton'和'ntoh'。 –

+0

通常,使用像json或xml这样的ascii格式进行网络数据传输可能是最安全的。如果发送机器使用64位整数,但使用32位呢?等 –

您正在寻求在文件中错误的地方。假设你的机器的尾数相同文件的字节序,那么这将工作:

fseek(in, long(&d.content.data.chunk[0] - &d), SEEK_SET); 
fread(&ch, 1, 1, in); 
fprintf(out, "%02x", (int)(ch & 0x00FF)); 

第一行计算在结构块的字节偏移量。你正在使用的sizeof(块),当然这只是返回1.

如果endian不同,那么在读取结构后,必须将每个非char字符转换为正确的endian。

+1

而且''offsetof()''可以从''进行偏移计算。 –

+0

@JonathanLeffler感谢您指出抵消。 –

+0

我一直在尝试解决这个问题大约1周,因为我对C有点新,并且你们都为我解决了这个问题。我把我的帽子给你们,谢谢soooo :) –