将char*转换为C 的结构

convert char* to structure in c++

本文关键字:结构 转换 char      更新时间:2023-10-16

我有以下结构

struct record{
RType m_rectype;
char m_recordname[11];
char m_recordNo;
char m_record_date[6];
}

,我有一个以下char*类型

的行
line = "1Netherlands3240382"

如何将这条线掩盖到结构中。性能很重要,因为我有一个庞大的数据处理。

我已经使用了reinterpret_cast,但是结构的数组元素是否终止。

record r = reinterpret_cast<const record* >(line)

编辑:最终结果应如下

r.m_rectype = "1"
r.m_recordname = "Netherlands"
r.m_recordNo = "3"
r.m_record_date = "240382"

但是我得到以下的

r.m_rectype = "1"
r.m_recordname = "Netherlands3240382"
r.m_recordNo = "3"
r.m_record_date = "240382"

谢谢

我已经使用了reinterpret_cast

reinterpret_cast不能用于此。您的用法具有不确定的行为。以下将得到很好的定义:

record r; // create a record object
std::memcpy(&r, line, sizeof r);

警告:

  • 字符串未终止!
  • sizeof(RType)必须是1
  • 输入缓冲区不得比sizeof r

但是我得到以下的

r.m_recordname = "Netherlands3240382"

Netherlands3240382不适合成员m_recordname,因此不可能是对象的状态。问题必须以产生输出的方式。我的怀疑是,该弦被对待好像是无效的,尽管不是这样。

假设 RTypechar备份的枚举类型(或某些 char类型的别名),则您的输入 memcpy您的输入到record对象。您也许还可以欺骗您的编译器,以执行您打算使用reinterpret_cast

您经历的问题,但是,听起来您是观察通过假设null终止字符串的函数,在此record对象中观察值。您应该使用接受长度的功能。

printf("r.m_rectype = "%d"", r.m_rectype);
printf("r.m_recordname = "%11.11s"", r.m_recordname);
printf("r.m_recordNo = "%d"", r.m_recordNo);
printf("r.m_record_date = "%6.6s"", r.m_record_date);

严格地说,标准不能保证struct元素之间的填充,除非一开始就没有填充。因此,即使您的特殊 struct不太可能有填充 - (我认为)所有角色类型,要安全,您也可以做这样的事情:

template<typename Pod>
char const* pod_copy(char const* p, Pod& pod)
{
    static_assert(std::is_pod_v<Pod>, "Must be Plain Old Data type");
    std::copy(p, p + sizeof(pod), reinterpret_cast<char*>(&pod));
    return p + sizeof(pod);
}
struct record{
    RType m_rectype;
    char m_recordname[11];
    char m_recordNo;
    char m_record_date[6];
};
int main()
{
    record r;
    auto line = "1Netherlands3240382";
    auto p = line;
    p = pod_copy(p, r.m_rectype);
    p = pod_copy(p, r.m_recordname);
    p = pod_copy(p, r.m_recordNo);
    p = pod_copy(p, r.m_record_date);
    // .. rest of program
}

这应该非常快,因为pos_copy应该很好地介入。