简体   繁体   English

Qt:将结构写入文件

[英]Qt: Write Struct to File

I'm struggling with writing a struct to a file via QFile in Qt. 我正在努力通过Qt中的QFilestruct写入文件。

typedef struct {
    uint32_t timestamp;
    uint32_t recordType;
    uint32_t payloadLength;
    char* payload;
} DataPacket;

The DataPacket struct is populated elsewhere: 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();
}

When I inspect the outputFile log file, the $GPGSA... string is no where to be seen. 当我检查outputFile日志文件时,看不到$GPGSA...字符串。 If I then additionally write the payload field separately: 如果我再另外写payload字段:

if (ok) {
    f.write((char *)&p, sizeof(DataPacket));
    f.write(p.payload, p.payloadLength);
    f.close();
}

The $GPGSA string is subsequently written correctly. $GPGSA字符串随后正确写入。

I'm missing something... 我想念的东西...

Another thing is that to keep Qt compatibility rename some native types, so I recommend using equivalent types, in addition to using QString directly instead of char * payload and payloadLength as shown below: 另一件事是,为了保持Qt兼容性重命名某些本机类型,因此,除了直接使用QString代替char * payload和payloadLength之外,我建议使用等效类型,如下所示:

struct DataPacket{
    quint32 timestamp;
    quint32 recordType;
    QString payload;
};

Also when writing it is better to use QDataStream as shown below: 同样在编写时最好使用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;
}

The following example shows its use: 以下示例显示了其用法:

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;
}

Output: 输出:

1000 123 "$GPGSA,M,3,03,23,22,19,17,01,09,31,12,,,,1.9,0.9,1.6*3D"

Note: QDataStream sets payloadLength indirectly because it knows the size of QString. 注意: QDataStream间接设置有效负载长度,因为它知道QString的大小。

Much simpler: 简单得多:

assuming your structure 'DataPacket' 假设您的结构为“ DataPacket”

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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM