【问题标题】:fread fseek struct member only in C仅在 C 中的 fread fseek 结构成员
【发布时间】:2016-09-10 19:12:54
【问题描述】:

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

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

看来我可以获取所有结构数据,或者只能获取一个字符。由于某种原因,数据也不正确,例如bytes 应该是实际的bytes,但它以1 的形式出现。显然,打印此结构中的数据的方式确实存在问题。可能与大端与小端有关吗?我知道我正在访问的文件是大端。

我访问的结构如下:

struct chunkInfo
{
    int chunkInformation; 
    int bytes;

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

【问题讨论】:

  • #pragma pack(忽略字节序)
  • 是的,如果你在intel架构上接收大端数据,你需要转换它。检查例如htonntoh.
  • 一般来说,使用 json 或 xml 之类的 ascii 格式进行网络数据传输可能是最安全的。如果发送机器使用 64 位整数,而你的机器使用 32 怎么办?等等。
  • 我很想知道我所做的是否是大/小端的问题。我个人不这么认为,因为“块”成员肯定是二进制的,我不需要担心它的格式(它的格式将由读取此文件的软件处理)。我只需要找到一种方法来选择结构的成员,这听起来很容易,但显然在 C 中非常困难。我想我需要寻找包含“块”的开始字节的文件(使用 fseek)然后阅读该部分。但它仍然让我望而却步。我相信这比我想象的要容易得多。
  • 嗨,Dieter,#pragma pack,真的需要读取一个简单的结构并仅选择该成员进行读取吗?

标签: c struct fread fseek


【解决方案1】:

您正在寻找文件中的错误位置。假设您的机器的字节序与文件的字节序相同,那么这将起作用:

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

第一行计算结构中块的字节偏移量。您使用的 sizeof(chunk) 当然只返回 1。

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

【讨论】:

  • 还有来自<stddef.h>offsetof()可以做偏移量计算。
  • 我已经尝试了大约 1 周来解决这个问题,因为我对 C 有点陌生,你们俩都为我解决了这个问题。我向你们脱帽致敬,非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多