• 2760阅读
  • 2回复

[提问]看书中Qdatastream的问题。 [复制链接]

上一主题 下一主题
离线caiwei_cs
 

只看楼主 倒序阅读 楼主  发表于: 2014-11-21
在《QT creator 快速入门》中15.2.2 使用数据流读写二进制数据中看到如下代码:
  1. QFile file1("file.dat");
  2.     file1.open(QIODevice::WriteOnly);
  3.     QDataStream out(&file1);
  4.     out<<QString("the answer is:");
  5.     out<<(qint32)42;
  6.     file1.flush();
  7.     file1.close();
  8.     file1.open(QIODevice::ReadOnly);
  9.     QDataStream in(&file1);
  10.     QString str;
  11.     qint32 a;
  12.     in>>str>>a;
  13.     qDebug()<<str<<a;
  14.     file1.close();

可以顺利运行。但是我有些不明白的地方:
1.例子中,先写入一个QString ,再写入一个(qint32),读出的时候是按照这个顺序读的。
那么,以Qdatastream读写数据就一定要匹配咯?不知道怎么写的,就可能读不出正确的数据?

是不是因为这个原因,书中下面介绍了:要在数据流前面写入一个简短的数据头。
是不是读的时候读出数据头。利用里面包含的幻数和版本号来确认数据格式
部分代码截图(图1-图3)下:

2.我按照上面代码写的数据。用ultraedit打开。
如图4:
为什么有很多空格呢?是因为写的是Qstring么?这个是qstring的格式,和c的字符串不一样。
群里有人说要看qt序列化的代码。
我搜了一下,但是还是没明白序列化是什么意思。代码也无从理解了


谢谢大家。

离线dbzhang800

只看该作者 1楼 发表于: 2014-11-21
1. QDataStream 写的东西,(一般来说,)必然要用QDataStream来读,而且读写顺序必须要对。

2. 文件头写入魔数,和前者没有必然关系。即使你写其他文件,一般也要添加标记把,不然你程序读到一个文件,你怎么确定该文件是不是你程序生成的文件??

3. 要了解QDataStream如何序列化,可以看Manual中的 Serializing Qt Data Types 一文。
离线caiwei_cs

只看该作者 2楼 发表于: 2014-11-24
谢谢楼上,知道了。
快速回复
限100 字节
 
上一个 下一个