先上代码:
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)