C++ Qt:将结构写入文件
我正在努力通过Qt中的C++ Qt:将结构写入文件,c++,qt,file,struct,C++,Qt,File,Struct,我正在努力通过Qt中的QFile将struct写入文件 typedef struct { uint32_t timestamp; uint32_t recordType; uint32_t payloadLength; char* payload; } DataPacket; 数据包结构在其他地方填充: QString dataString = "$GPGSA,M,3,03,23,22,19,17,01,09,31,12,,,,1.9,0.9,1.6*3D";
QFile
将struct
写入文件
typedef struct {
uint32_t timestamp;
uint32_t recordType;
uint32_t payloadLength;
char* payload;
} DataPacket;
数据包
结构在其他地方填充:
QString dataString = "$GPGSA,M,3,03,23,22,19,17,01,09,31,12,,,,1.9,0.9,1.6*3D";
DataPacket p;
memset(&p, 0, sizeof(DataPacket));
p.timestamp = now();
p.recordType = 1;
QByteArray arr = dataString.toLatin1();
p.payloadLength = arr.count();
p.payload = arr.data();
// Write the data to a log file
QFile f;
f.setFileName(outputFile);
bool ok = f.open(QIODevice::WriteOnly);
if (ok) {
f.write((char *)&p, sizeof(DataPacket));
f.close();
}
当我检查outputFile
日志文件时,$GPGSA…
字符串在哪里都看不到。如果我随后另外单独写入有效负载
字段:
if (ok) {
f.write((char *)&p, sizeof(DataPacket));
f.write(p.payload, p.payloadLength);
f.close();
}
$GPGSA
字符串随后被正确写入
我遗漏了一些东西…另一件事是为了保持Qt兼容性,请重命名一些本机类型,因此除了直接使用QString而不是char*payload和payloadLength之外,我建议使用等效类型,如下所示:
struct DataPacket{
quint32 timestamp;
quint32 recordType;
QString payload;
};
QDataStream &operator>>(QDataStream &in, DataPacket &p){
in >> p.timestamp >> p.recordType >>p.payload;
return in;
}
QDataStream &operator<<(QDataStream &out, const DataPacket &p){
out << p.timestamp << p.recordType <<p.payload;
return out;
}
此外,在编写时,最好按如下所示使用:
struct DataPacket{
quint32 timestamp;
quint32 recordType;
QString payload;
};
QDataStream &operator>>(QDataStream &in, DataPacket &p){
in >> p.timestamp >> p.recordType >>p.payload;
return in;
}
QDataStream &operator<<(QDataStream &out, const DataPacket &p){
out << p.timestamp << p.recordType <<p.payload;
return out;
}
注意:QDataStream间接设置payloadLength,因为它知道QString的大小 简单得多:
假设您的结构为“数据包”
void MyClass::write()
{
QFile out(FILE_PATH_NAME);
out.open(QIODevice::WriteOnly);
out.write((const char *)DataPacket,sizeof(DataPacket));
out.close();
}
void MyClass::read()
{
QFile in(FILE_PATH_NAME);
in.open(QIODevice::ReadOnly);
in.read((const char *)DataPacket,sizeof(DataPacket));
in.close();
}
sizeof(数据包)
只包含整数成员和指针,不包含实际字符串。尝试使用Qt序列化,但首先将char*
替换为QString
。您只需要逐个成员进行Qt序列化:尝试使用以下命令:const char*str=dataString.toStdString().c_str();QByteArray arr=QByteArray::fromRawData(str,sizeof(str));你找到我的解决方案了吗?