Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:将结构写入文件_C++_Qt_File_Struct - Fatal编程技术网

C++ 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";

我正在努力通过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";

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));你找到我的解决方案了吗?