看书中Qdatastream的问题。

caiwei_cs 2014-11-21 02:39:54
在《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序列化的代码。
我搜了一下,但是还是没明白序列化是什么意思。代码也无从理解了。


谢谢大家。
...全文
319 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiwei_cs 2014-11-24
  • 打赏
  • 举报
回复
谢谢大家了。
Inhibitory 2014-11-22
  • 打赏
  • 举报
回复
读取时的顺序一定要和写入的顺序一致。 例如写入QString, int,其实在文件里在这个QString前有一个QString的类型标志表明这里写入的是QString的内容,所以读取时按QString读取,而不是按其他类型读取,int的也是。
dext 2014-11-22
  • 打赏
  • 举报
回复
文件就是死的,你写什么就是什么,之所以有那么多的零(不是空格) 空格是 32 (0x20),是因为 QString 用的是 Unicode,如果想要变成C格式的话 可以 使用 QString::toLocal8Bit()
ibm123 2014-11-22
  • 打赏
  • 举报
回复
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
wenwu1225 2014-11-21
  • 打赏
  • 举报
回复
编码格式跟C的不一样,所以看到那么多0.

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧