仅在C中使用fread fseek结构成员

仅在C中使用fread fseek结构成员,c,struct,fread,fseek,C,Struct,Fread,Fseek,在C语言中,我试图选择一个结构的特定成员并将其打印出来。我想知道,这种手术的建议形式是什么?我几乎试过了我能想到的一切。我似乎无法将其限制为结构的特定块成员 fseek(in, sizeof(d.contents.datas.chunk), SEEK_SET); fread(&ch, 1, 1, in); fprintf(out, "%02x", (int)(ch & 0x00FF)); 看起来我要么可以得到所有的结构数据,要么只能得到一个字符。出于某些原因,数据也没有正确显示

在C语言中,我试图选择一个结构的特定成员并将其打印出来。我想知道,这种手术的建议形式是什么?我几乎试过了我能想到的一切。我似乎无法将其限制为结构的特定块成员

fseek(in, sizeof(d.contents.datas.chunk), SEEK_SET);
fread(&ch, 1, 1, in);
fprintf(out, "%02x", (int)(ch & 0x00FF));
看起来我要么可以得到所有的结构数据,要么只能得到一个字符。出于某些原因,数据也没有正确显示,例如字节应该是实际字节,但它显示为1。显然,这个结构的数据打印方式确实有问题。这可能与大端端和小端端有关吗?我知道我正在访问的文件是big endian

结构Im访问如下所示:

struct chunkInfo
{
    int chunkInformation; 
    int bytes;

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

您正在查找文件中的错误位置。假设您的计算机的endian与文件的endian相同,则这将起作用:

fseek(in, long(&d.content.data.chunk[0] - &d), SEEK_SET);
fread(&ch, 1, 1, in);
fprintf(out, "%02x", (int)(ch & 0x00FF));
第一行计算结构中块的偏移量(以字节为单位)。您使用的是sizeofchunk,它当然只返回1


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

忽略endian时使用pragma pack是的,如果您使用的是英特尔体系结构并以big-endian接收数据,则需要将其转换。查看例如hton和ntoh。通常,在网络数据传输中使用像json或xml这样的ascii格式可能是最安全的。如果发送计算机使用64位整数,而您的计算机使用32位整数,该怎么办?等等。我很想知道我所做的是否是大/小endian的问题。我个人认为不是,因为chunk成员绝对是二进制的,我不需要担心它的格式,它的格式将由读取此文件的软件处理。我只需要找到一种方法来选择结构的一个成员,这听起来很简单,但在C语言中显然是非常困难的。我想我需要使用fseek查找包含chunk的开始字节的文件,然后使用fread查找该部分。但我还是不明白。我确信这比我想象的要容易得多。嗨,Dieter,pragma pack,阅读一个简单的结构并只选择该成员进行阅读真的需要吗?还有offsetof,可以进行偏移计算。我已经尝试了大约一周来解决这个问题,因为我对C有点陌生,你们两个都为我解决了这个问题。我向你们脱帽致敬,非常感谢: