我正在努力通过 Qt 中的 QFile
将 struct
写入文件。
typedef struct {
uint32_t timestamp;
uint32_t recordType;
uint32_t payloadLength;
char* payload;
} DataPacket;
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...
字符串。如果我再单独编写 payload
字段:
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
如下图:
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;
}
下面的例子展示了它的用法:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
const QString fileName = "file.log";
QString dataString = "$GPGSA,M,3,03,23,22,19,17,01,09,31,12,,,,1.9,0.9,1.6*3D";
DataPacket pin{1000, 123, dataString};
QFile fout(fileName);
if(fout.open(QIODevice::WriteOnly)){
QDataStream out(&fout);
out<<pin;
}
fout.flush(); // or fout.close();
DataPacket pout;
QFile fin(fileName);
if (fin.open(QIODevice::ReadOnly)) {
QDataStream in(&fin);
in>>pout;
qDebug()<<pout.timestamp<<pout.recordType<<pout.payload;
}
return 0;
}
输出:
1000 123 "$GPGSA,M,3,03,23,22,19,17,01,09,31,12,,,,1.9,0.9,1.6*3D"
注意:QDataStream 间接设置 payloadLength,因为它知道 QString 的大小。
关于c++ - Qt:将结构写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46283613/