QT:将结构写入文件
Qt: Write Struct to File
我正在努力通过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
字符串。
我缺少一些东西...
另一件事是,除了直接使用QString而不是CHAR *有效载荷和有效载荷长度外,我建议使用等价类型重命名某些本机类型,因此我建议使用等价类型。P>
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集合有效载体长度间接,因为它知道QString的大小。
更简单:
假设您的结构'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();
}
相关文章:
- C++将文本文件中的数据读取到结构数组中
- 调用 C 文件中的"C++"结构
- 结构包含在两个头文件中,这两个文件我都不拥有
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 介子复制/安装头文件到输出目录并保持文件夹结构
- Windows 将标准的 C 文件结构注入到正在运行的进程中
- 如何读取/查询文件系统和文件结构
- C++/Python 中对象和结构的二进制文件结构
- 在 C++ 和 C# 之间共享内存映射文件结构
- 在文件结构中使用字符串而不是带有 read() 和 write() 的字符数组
- C++ while 循环在自定义文件结构中
- QT C 读取自定义文件结构
- CPP 头文件结构错误
- 安卓rom文件结构和调试
- 文件映射和文件结构
- 文件结构,以避免数据损坏
- 文件处理中给出奇怪值的流(指向文件结构的指针)
- 程序c++程序的文件结构
- 常规c++程序头文件结构
- FreeBSD 和 Linux 中的 ELF 文件结构