将混合数据读入C结构

时间:2011-08-06 05:32:17

标签: c data-structures

我正在尝试将混合数据读入C结构

通常,我会做这样的事情

typedef struct data {
    uint32_t value;
    float x,y,z;
} __attribute__((__packed__));

并按如下方式阅读:

data x;
fread(&x, 1, sizeof(data), filePointer);

这对于固定长度的数据来说效果很好,但是,我需要加载一个ASCIIZ字符串,它是可变长度的,我想知道是否有一种简单的方法可以将它读入结构

2 个答案:

答案 0 :(得分:1)

很抱歉,但没有针对C. This has been asked on SO before with some very good answers的内置序列化。

如果这不能满足您的需求,请在您最喜爱的搜索引擎中搜索C serializeC serialization

答案 1 :(得分:1)

有两种方法可以将ASCIIZ字符串存储在结构中,例如:

struct asciiz_1
{
    char asciiz[32];
};
struct asciiz_2
{
    size_t buflen;
    char  *buffer;
};

第一个(struct asciiz_1)的处理方式与struct data相同;即使字符串在null(零)字节之后可能具有可变长度的垃圾,整个结构也是固定大小,可以使用fread()fwrite()安全处理。

第二个(struct asciiz_2)是一个失败的原因。你必须分配额外的空间来接收字符串(大概是在读取长度之后),并且指针值不应该写入文件(它对读取过程没有任何意义)。所以,你必须以不同的方式处理它。

您的数据结构 - 您的选择。