• 8886阅读
  • 4回复

QDataStream和fread的问题 [复制链接]

上一主题 下一主题
离线roywillow
 

只看楼主 倒序阅读 楼主  发表于: 2010-09-12
— 本帖被 XChinux 执行加亮操作(2010-09-12) —
最近尝试将一个用C写的程序转到Qt上,结果本菜鸟遇到了很郁闷的问题啊……
fread可以将一定量的字节读入变量中,并且即使没有足量的字节来读入,也可以将不足量的字节放入变量中。
但是QDataStream就挺郁闷了,如果没有足量的字节 >> 入变量,就会读入一个0,而不是剩下的那些不足量的字节。
举个例子吧,fread(&a, 4, 1, file)将当前文件指针处读入4个字节至a中。如果此时指针在倒数第2个字节处,显然没有足量的字节了,但是fread仍然能读入这些字节。
但是如果是fileStream >> a,a为quint32,file的pos在倒数第二个字节处,那么这个时候a就是0,剩下的字节直接无视了。

所以,该怎么解决……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线roywillow

只看该作者 1楼 发表于: 2010-09-13
顶起来继续等……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 2楼 发表于: 2010-09-14
既然 fread 完全满足你的要求,直接用就好了。

个人观点:你应该用QDataStream来读用 QDataStream 写入的数据(并且保证二者一致)。 其他情况不要用QDataStream。特别是你举得这个例子。你肯定没办法用(当流中不足4个字节的时候,你无法读出 quint32 的) http://doc.qt.nokia.com/latest/datastreamformat.html
离线roywillow

只看该作者 3楼 发表于: 2010-09-14
因为总感觉fread用起来不舒服,况且fread不能用在QFile上吧……
还有fread等等的平台相关性如何?
也就是说QDataStream没法解决这个问题了是么
或者可以自己一个一个字节读取然后自己组装XDD
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线dbzhang800

只看该作者 4楼 发表于: 2010-09-14
引用第3楼roywillow于2010-09-14 12:16发表的  :
因为总感觉fread用起来不舒服,况且fread不能用在QFile上吧……
还有fread等等的平台相关性如何?
也就是说QDataStream没法解决这个问题了是么
或者可以自己一个一个字节读取然后自己组装XDD

1. fread 是 C标准库中的函数,跨平台性比Qt好得多
2. 不是说QDataStream没法解决这个问题,我只是说你不能这么用。(因为我看不懂你的意图是什么)

如果你只是想将2个字节作为整数读进 qint32,先读进qint16,在赋值给qint32就行了。但从你的描述我不知道你需要的什么操作

3. QFile 不是有 read 函数么,你一次读4个字节进来,读到你的qint32所在内存不就行了。(当不足4字节时,你也可以按你的需要进行特殊处理)
快速回复
限100 字节
 
上一个 下一个