从数组中的文件读取多个浮点数

时间:2018-07-25 07:57:49

标签: 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(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;
}

但是分别读取这些浮点数并不是那么有效,所以我想一起读取前4个浮点数(maxX,maxY,minX,minY),然后读取一个int,然后读取所有其他浮点数(floatX和floatY的实例) )在一起。
我已经尝试过了:

 QDataStream in(&file);
 QByteArray ba;
 in.readRawData(ba.data(), 4*sizeof(float));

 float array[4];
 memcpy(&array, ba.constData(), ba.size());

但是它给出了错误的结果。

那么,如何在一个缓冲区数组或向量中读取许多浮点数?

UPD:

我也已经看到getline()了,但是我究竟如何从二进制文件中遍历char *并从中获取浮点数呢?

1 个答案:

答案 0 :(得分:1)

来自文档:

  

“ QDataStream类将二进制数据序列化为   QIODevice。”

如果使用getRawData()方法,则将获得二进制数据。这就是为什么在将它们解释为其他结果时得到错误结果的原因。

如果您想加快速度,我的建议是不要使用QDataStream,而使用常规标准fstream

为避免多次读取,请使用getline()阅读整行,然后遍历存储在其中的数字。