【问题标题】:How to read array from QDataStream如何从 QDataStream 中读取数组
【发布时间】:2017-06-28 14:28:35
【问题描述】:

我想将存储在向量(保存结构)中的数据写入文件,并从该文件中读取数据。我尝试使用 QDataStream 并重载“>>”和“

以下是结构:

typedef struct
{
   char data[cNetworkMessageLengthMax + 1];   //cNetworkMessageLengthMax=19
} __attribute__((packed)) networkMessageBody_t;


typedef struct 
{
    baseStation_daytime_t   timestamp;
    uint32_t                blueId;
    networkMessageBody_t    message;
} __attribute__((packed)) baseStation_mailbox_t;

和运营商:

QDataStream &operator<<(QDataStream &out, const std::vector<baseStation_mailbox_t> &data)
{
    for(uint8_t i=0; i < data.size(); i++)
    {
        out << data[i].timestamp.time.hour;
        out << data[i].timestamp.time.minute;
        out << data[i].timestamp.time.second;
        out << data[i].timestamp.time.thousandth;
        out << data[i].timestamp.date.day;
        out << data[i].timestamp.date.month;
        out << data[i].timestamp.date.year;

        out << data[i].blueId;

        out << data[i].message.data;
    }
    return out;
}

QDataStream &operator>>(QDataStream &in, std::vector<baseStation_mailbox_t> &data)
{
    uint16_t tmp16;
    uint32_t tmp32;
    char tmpChar[20];

    uint8_t i = 0;
    while(in.atEnd() == false)
    {
        data.emplace_back();

        in >> data[i].timestamp.time.hour;
        in >> data[i].timestamp.time.minute;
        in >> data[i].timestamp.time.second;
        in >> tmp16;
        data[i].timestamp.time.thousandth = tmp16;
        in >> data[i].timestamp.date.day;
        in >> data[i].timestamp.date.month;
        in >> tmp16;
        data[i].timestamp.date.year = tmp16;

        in >> tmp32;
        data[i].blueId = tmp32;

        in >> tmpChar;                 //HERE I get errors
        data[i].message.data = tmpChar;

        i++;
    }

    return in;
    }

【问题讨论】:

  • 为什么不QString
  • 我无法更改 networkMessageBody_t 中的 char 数组数据。除此之外,我并不反对 QString,但如果我知道在这种情况下如何使用它,我就不会在这里;)

标签: c++ qt


【解决方案1】:

替换:

  • out &lt;&lt; data[i].message.data;out &lt;&lt; QByteArray::fromRawData(data[i].message.data,std::extent&lt;decltyple(data[i].message.data)&gt;::value);
  • char tmpChar[20];QByteArray tmpChar;
  • data[i].message.data = tmpChar;std::copy(tmpChar.constBegin(),tempChar.constEnd(),data[i].message.data);

【讨论】:

  • 行得通,谢谢!但即使在查看手册页后,我也不太明白该部分是如何返回数据数组的大小的:std::extent&lt;decltyple(data[i].message.data)&gt;::value 你能详细说明extent 和值是doing 这里吗?
  • 来自en.cppreference.com/w/cpp/types/extent: 模板 struct extent;如果 T 是数组类型,则提供等于数组第 N 维的元素数的成员常量值您可以将其替换为 20 但这样,如果您更改数据的大小,范围的大小会自动调整
猜你喜欢
  • 2013-11-09
  • 2021-02-01
  • 2017-07-18
  • 2016-11-04
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多