如何从 QDataStream 中读取数组
Posted
技术标签:
【中文标题】如何从 QDataStream 中读取数组【英文标题】:How to read array from 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,但如果我知道在这种情况下如何使用它,我就不会在这里;)
【参考方案1】:
替换:
out << data[i].message.data;
与 out << QByteArray::fromRawData(data[i].message.data,std::extent<decltyple(data[i].message.data)>::value);
char tmpChar[20];
与 QByteArray tmpChar;
data[i].message.data = tmpChar;
与 std::copy(tmpChar.constBegin(),tempChar.constEnd(),data[i].message.data);
【讨论】:
行得通,谢谢!但即使在查看手册页后,我也不太明白该部分是如何返回数据数组的大小的:std::extent<decltyple(data[i].message.data)>::value
你能详细说明extent
和值是doing
这里吗?
来自en.cppreference.com/w/cpp/types/extent: 模板20
但这样,如果您更改数据的大小,范围的大小会自动调整以上是关于如何从 QDataStream 中读取数组的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中使用 QDataStream 读取在 QT 中创建的二进制文件
从 QDataStream 读取 QDateTime 给出 null
从 ipc fifo 文件描述符读取缓冲区时未初始化 QDataStream