先上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
int main( int argc, char *argv[]) { QApplication a(argc, argv); QFile file1( "test.dat" ); if (!file1.open(QIODevice::WriteOnly)) std::cout<< "can not open file" <<std::endl; QDataStream fout(&file1); float f=80.4; fout<<f; std::cout<< "done!" <<std::endl; file1.close(); return a.exec(); } |
原意应该输出float类型的二进制文件,其长度应该为32bit即四字节,但输出结果如下图:
长度为8字节,后面四字节是多出来的
我将程序改成使用QByteArray 时,则可以正常输出,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
int main( int argc, char *argv[]) { QApplication a(argc, argv); QFile file1( "test.dat" ); if (!file1.open(QIODevice::WriteOnly)) std::cout<< "can not open file" <<std::endl; QDataStream fout(&file1); QByteArray byteArray; QBuffer buffer1(&byteArray); buffer1.open(QIODevice::WriteOnly); QDataStream out(&buffer1); float f=80.4; out<<f; fout.writeRawData(byteArray, sizeof ( float )); std::cout<< "done!" <<std::endl; file1.close(); return a.exec(); } |
此时输出结果正常
求高手解释原理!
算是自问自答吧,今天仔细看了一下帮助文档,原来在高版本中QDataStream中默认精度为double,所以需要在程序中将QDataStream中浮点数精度改为single,办法为QDataStream::setFloatingPointPrecision(QDataStream::singlePrecision)