【问题标题】:Read multiple floats from file in array从数组中的文件中读取多个浮点数
【发布时间】:2018-07-25 07:57:49
【问题描述】:

我想从我已经写过的文件中读取多个浮点值:

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 * 并从中获取浮点数?

【问题讨论】:

  • 您的内存副本是否向后交换了源和目标? [这看起来不正确 --- memcpy(&array, ba.constData(), ba.size());]
  • 您确定单独阅读它们是低效的吗?你有介绍吗?您想要执行此操作的方式会添加一个额外的副本,因此我不确定这是否更快。
  • @WilliamJBagshaw 我知道这不正确,但我不知道如何以正确的方式解决它
  • 您的方法假定文件和内存中的数据布局(如字节序)是相同的。通过使用QDataStream 运算符,您可以确保这得到了解决。因此,如果可以避免,我不会读取原始字节,而是更喜欢官方功能。
  • 所以我猜这个函数不只是被调用一次,而是数百万次?我不认为磁盘 i/o 有什么不同,因为来自磁盘的数据在多个层中被缓存和缓冲,几乎永远不会只有 4 个字节会从磁盘读取。

标签: c++ qt deserialization qdatastream


【解决方案1】:

来自文档:

“QDataStream 类将二进制数据序列化为 QIO 设备。”

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

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

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

【讨论】:

  • 感谢您的建议。但是我已经尝试使用 ifstream 并且也得到了错误的结果。我也尝试搜索适用于我的任务的示例,但它们也给出了错误的结果,所以你能提供我可以使用的代码示例吗?
  • 删除&amp; 字符没有任何区别,因为数组的地址与第一个元素的地址相同。
  • 是的,我也已经看到了 getline(),但是我究竟如何从二进制文件中迭代 char * 并从中获取浮点数?
  • 使用fstream 写入文件,这样数据就不会被保存为二进制文件。然后通过sstringstreamchar * 从字符串中提取数据,方法是将数组转换为float * 并像往常一样进行索引。 char *data = ...; float *f = (float *)data; float f1 = f[0]
猜你喜欢
  • 2021-10-19
  • 1970-01-01
  • 2017-09-24
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多