在《QT creator 快速入门》中15.2.2 使用数据流读写二进制数据中看到如下代码:
QFile file1("file.dat");
file1.open(QIODevice::WriteOnly);
QDataStream out(&file1);
out<<QString("the answer is:");
out<<(qint32)42;
file1.flush();
file1.close();
file1.open(QIODevice::ReadOnly);
QDataStream in(&file1);
QString str;
qint32 a;
in>>str>>a;
qDebug()<<str<<a;
file1.close();
可以顺利运行。但是我有些不明白的地方:
1.例子中,先写入一个QString ,再写入一个(qint32),读出的时候是按照这个顺序读的。
那么,以Qdatastream读写数据就一定要匹配咯?不知道怎么写的,就可能读不出正确的数据?
是不是因为这个原因,书中下面介绍了:要在数据流前面写入一个简短的数据头。
是不是读的时候读出数据头。利用里面包含的幻数和版本号来确认数据格式?
这部分代码截图(图1-图3)下:
2.我按照上面代码写的数据。用ultraedit打开。
如图4:
为什么有很多空格呢?是因为写的是Qstring么?这个是qstring的格式,和c的字符串不一样。
群里有人说要看qt序列化的代码。
我搜了一下,但是还是没明白序列化是什么意思。代码也无从理解了。
谢谢大家。
------解决思路----------------------
文件就是死的,你写什么就是什么,之所以有那么多的零(不是空格) 空格是 32 (0x20),是因为 QString 用的是 Unicode,如果想要变成C格式的话 可以 使用 QString::toLocal8Bit()
------解决思路----------------------
读取时的顺序一定要和写入的顺序一致。
例如写入QString, int,其实在文件里在这个QString前有一个QString的类型标志表明这里写入的是QString的内容,所以读取时按QString读取,而不是按其他类型读取,int的也是。
------解决思路----------------------
QDataStream的序列化,就是将不同数据类型或对象的内存字节按固定的格式写入QIODevice,实际上是没有任何标识写入的数据类型是什么,只有编程人员清楚写入的类型顺序,也只能按写入的数据类型才能正确读出。
QString类型:
前四位是数据的长度,即上面的00 00 00 1C,即长度28,随后28个字节即是QString的实际数据。QBytesArray, char*数据格式一样,唯一不同是char*会有一个结束符0x00, 计算在长度内.即写入"abc", 前四位会是00 00 00 04
后面的00 00 00 2A:即是qint32类型值:42