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());