C++ 从数组中的文件读取多个浮点值
我想从文件中读取多个浮点值,我已经使用以下方法编写了该文件:C++ 从数组中的文件读取多个浮点值,c++,qt,deserialization,qdatastream,C++,Qt,Deserialization,Qdatastream,我想从文件中读取多个浮点值,我已经使用以下方法编写了该文件: QDataStream &operator<<(QDataStream &out, const SomeClass &obj) { out << obj.maxX << obj.maxY << obj.minX << obj.minY; out << (int) obj.points.size(); for(in
QDataStream &operator<<(QDataStream &out, const SomeClass &obj)
{
out << obj.maxX << obj.maxY << obj.minX << obj.minY;
out << (int) obj.points.size();
for(int c = 0; c < obj.points.size(); ++c){
out << obj.points.at(c).floatX << obj.points.at(c).floatY;
}
return out;
}
QDataStream &operator>>(QDataStream &in, SomeClass &obj)
{
in >> obj.maxX >> obj.maxY >> obj.minX >> obj.minY;
int pointsSize = 0;
in >> pointsSize;
for(int c = 0; c < pointsSize; ++c){
float x = 0, y = 0;
in >> x >> y;
obj.points.push_back(Point(x, y));
}
return in;
}
但它给出了错误的结果
那么,如何在一个缓冲区数组或向量中读取多个浮点呢
UPD:
我也已经看到了getline(),但如何从二进制文件中迭代char*
,并从中获取浮点值呢?从文档:
“QDataStream类将二进制数据序列化到
QIODevice。”
如果使用getRawData()
方法,则会得到二进制数据。这就是为什么当你把结果解释成其他东西时,你会得到错误的结果
如果您想加快速度,我的建议是不要使用QDataStream
,而是使用常规的标准fstream
为了避免多次读取,请使用读取整行数据,然后对其中存储的数字进行迭代。是否在源和目标交换的情况下向后复制memcopy?[这看起来不正确--memcpy(&array,ba.constData(),ba.size());]您确定单独读取它们效率低吗?你分析过它吗?您希望这样做的方式会添加一个额外的副本,因此我不能确定这样做是否更快。@WilliamJBagshaw我知道这是不正确的,但我不知道如何以正确的方式修复它。您的方法假设文件和内存中的数据布局(如endianess)是相同的。通过使用
QDataStream
操作符,您可以确保这一点得到解决。所以如果可以避免的话,我不会读取原始字节,我更喜欢官方函数。所以我猜这个函数不只是调用一次,而是调用了数百万次?我不认为磁盘I/o有什么区别,因为磁盘上的数据是在几层缓存和缓冲的,几乎从来不会从磁盘上只读取4个字节。谢谢你的建议。但我已经尝试使用ifstream,也得到了错误的结果。此外,我还尝试搜索适用于我的任务的示例,但它们也给出了错误的结果,因此您可以给出我可以使用的代码示例吗?删除&
字符不会有任何区别,因为数组的地址与第一个元素的地址相同。是的,我也看到了getline(),但是,如何从二进制文件中迭代char*
,并从中获取浮点值呢?使用fstream
写入文件,这样数据就不会保存为二进制文件。然后通过sstringstream
从字符串中提取数据,或者通过将数组强制转换为float*
并像往常一样索引从char*
中提取数据<代码>字符*数据=。。。;float*f=(float*)数据;浮点f1=f[0]
QDataStream in(&file);
QByteArray ba;
in.readRawData(ba.data(), 4*sizeof(float));
float array[4];
memcpy(&array, ba.constData(), ba.size());