问题描述
在linux系统下用qt写二进制文件时,使用QDataStream类进行存储文件。结果查看到每次写入都会在头部多出四个字节的长度。如下图所示:
问题分析
写入二进制文件代码如下:
QFile file(m_File);
if (!file.open(QIODevice::WriteOnly|QIODevice::Append))
{
qDebug() << "File cannot open!";
return;
}
QDataStream out(&file);
out << ba << appendtimeflag(); //函数返回一个7字节长度的时间戳字符串(年月日时分秒)
file.flush();
file.close();
使用linux下的xxd命令查看生成的二进制文件内容。
xxd -g 1 xxx.dat //二进制文件名
显示结果如上图,55 BB前多了 00 00 00 1e,时间戳前多了00 00 00 07,多出四字节的int值正好是后面紧跟二进制数据的长度。应该是QDataStream自动添加的头,找了一下QDataStream类,发现产生的原因是QDataStream的构造函数实际上是QDataStream(QByteArray*, int);但没有发现如何不输出这个长度头。
修正
舍弃QDataStream类写文件,使用QFile类的写法。。如下:
QFile file(m_File);
if (!file.open(QIODevice::WriteOnly|QIODevice::Append))
{
qDebug() << "file cannot open!";
return;
}
ba += appendtime();
file.write(ba);
file.flush();
file.close();
读取生成文件的结果如下图,没有问题了。
写在最后
经过这次,以后恐怕是不敢再用QDataStream类写文件了。自动加头并在输出中体现,这个鸡肋又多余的功能不知道是那位大神编写的。