正确的QMap
序列化和反序列化代码如下:
main.cpp
#include <QString>
#include <QFile>
#include <QMap>
#include <QDataStream>
#include <QDebug>
void write()
{
QString filename = "snippets.txt";
QFile myFile(filename);
if (!myFile.open(QIODevice::WriteOnly))
{
qDebug() << "Could not write to file:" << filename << "Error string:" << myFile.errorString();
return;
}
QMap<QString, QString> map;
map.insert("one", "this is 1");
map.insert("two", "this is 2");
map.insert("three", "this is 3");
QDataStream out(&myFile);
out.setVersion(QDataStream::Qt_5_3);
out << map;
}
QMap<QString,QString> read()
{
QString filename = "snippets.txt";
QFile myFile(filename);
QMap<QString, QString> map;
QDataStream in(&myFile);
in.setVersion(QDataStream::Qt_5_3);
if (!myFile.open(QIODevice::ReadOnly))
{
qDebug() << "Could not read the file:" << filename << "Error string:" << myFile.errorString();
return map;
}
in >> map;
return map;
}
int main()
{
write();
qDebug() << read();
return 0;
}
main.pro
TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp
构建并运行
qmake && make && ./main
Output
QMap(("one", "this is 1")("three", "this is 3")("two", "this is 2"))
您遇到了几个问题:
这让你很难揭露真正的问题。
这是在没有正确的错误报告的情况下向您隐藏的问题。这里的问题是,当您打开文件仅进行写入时,任何后续的读取操作自然会产生空结果。我在做的时候有点隐藏QDataStream
,但是如果你快速浏览一下QIO设备文档当您直接阅读 QFile 实例时,会更清楚错误的打开模式下面发生了什么:
从设备读取最多 maxSize 字节到数据中,并返回读取的字节数。如果发生错误,例如尝试从只写模式下打开的设备读取数据时,该函数将返回 -1。
如果你检查了错误,这一点就会变得更清楚。公平地说,在您的情况下,在这个简单的代码片段中,在操作之前共享文件而不关闭它是可以接受的。在这种情况下,您将使用诸如重新查找开头和 QIODevice::ReadWrite 之类的方法。话虽如此,这只是另一种方式。
这只是一个旁注,但您显式添加了空格,而 qDebug() 已经为您执行了此操作。
这是多余的,因为它是在通过类析构函数关闭文件描述符时自动完成的。
这是通过适当的 RAII 自动完成的。如果文件仍然打开,析构函数将为您关闭它。由于您离开了函数的作用域,因此当您的文件对象在堆栈上构造时,将自动调用析构函数。