从QSharedPointer <float>中获取二进制数据会产生意外的文件大小

时间:2016-07-20 16:17:46

标签: c++ qt file qsharedpointer

我目前的问题基本上是我似乎无法将我想要的所有数据写入磁盘。

我要做的是将二进制格式的浮点值一个接一个地保存到磁盘。在1.000.000和400.000.000浮点值之间可以存在任意偶数个值。在内部,数据存储在QSharedPointer中。我在不同的线程中使用不同函数中的相同数据。我确信,访问权限不会改变字段中的值。

我所拥有的与此类似:

class blubb : public QObject
{
    Q_OBJECT
 public slots:
    void foo(QSharedPointer<float> data, size_t size)
    {
        QFile saveFile("ExampleFileName");
        QDataStream streamer;

        saveFile.open(QIODevice::WriteOnly);

        streamer.setDevice(&saveFile);
        streamer.setFloatingPointPrecision(QDataStream::SinglePrecision);
        streamer.setByteOrder(QDataStream::BigEndian);

        qDebug() << "Now writing: " << size << " elements." << endl;
        qDebug() << "With: " << sizeof (*data.data()) << " byte per entry." << endl;
        qDebug() << "Total space: " << size * sizeof(*data.data()) << " bytes.";        


        for (size_t i = 0; i < size; i++)
        {
            streamer << (data.data())[i];
        }

        qInfo() << "Writing done of " << size << " float values of "
                << sizeof (*data.data()) << " bytes per entry, total written space: "
                << size * sizeof(*data.data());
    }
};

如果我在数据中有例如4.000.000浮点值,我会按预期获得所有内容:4.000.000要写入的元素,每个元素4个字节以及要写入的总共16.000.000个字节。但我发现的实际数量是:15.990.784字节。

如果我在数据中尝试总共2.000.000个元素,则写入的字节数为:7.995.392而不是8.000.000。这是一致和可重复的。丢失的字节数与数据中的条目数量成正比。

有趣的事实:我在另一个使用相同QSharedPointer的线程中有另一个函数来执行此操作:

class blubber2 : public QObject
{
    Q_OBJECT
public slots:
    void fooOtherThread(QSharedPointer<float> data, size_t size)
    {
        if ((size % 2) != 0)
        {
            std::invalid_argument ex("Data is not evenly sized.");
            throw ex;
        }

        QVector<float> vec1;
        QVector<float> vec2;

        bool toggle = false;

        std::partition_copy(data.data(),
                            data.data()+size,
                            std::back_inserter(vec1),
                            std::back_inserter(vec2),
                            [&toggle](int)
        {
            return toggle = !toggle;
        });

    }
};

如果我在数据中有4.000.000个条目,则vec1和vec2中的元素数量为2.000.000。

那么我在第一个函数中做错了什么?为什么我将错误的字节数写入文件?

编辑://这应该开始整个事情:

class Starter : public QObject
{
signals: 
    void startSignal(QSharedPointer<float> data, size_t size);

public slots:
    void helperStart()
    {
        size_t size = 2000000;
        QSharedPointer<float> data(new float[size]);
        emit startSignal(data, size);
    }

};
int main (int argc, char ** argv)
{
    QCoreApplication app(argc, argv);
    qRegisterMetaType<QSharedPointer<float>>("QSharedPointer<float>");
    qRegisterMetaType<size_t>("size_t");

    blubb blubbInstance;
    blubber2 blubberInstance;

    QThread blubbThread;
    QThread blubberThread;

    blubbInstance.moveToThread(&blubbThread);
    blubberInstance.moveToThread(&blubberThread);

    blubbThread.start();
    blubberThread.start();


    Starter starterInstance;
    QTimer timer;
    timer.setSingleShot(500);
    QObject::connect(&timer, &QTimer::timeout, &starterInstance, &Starter::helperStart);

    QObject::connect(&starterInstance, &Starter::startSignal, &blubbInstance, &blubb::foo);
    QObject::connect(&starterInstance, &Starter::startSignal, &blubberInstance, &blubber2::fooOtherThread);

    timer.start();
    app.exec();        
}

0 个答案:

没有答案