0

我正在尝试使用 Qt API 读取一组无符号短裤。不幸的是,我没有得到想要的结果。

以下代码

        QFile in(fileName);
        int len = in.size();
        QDataStream d(&in);

        quint16 *data = new quint16[len];
        qDebug() << data[0];
        qDebug() << data[1];
        d >> data[0];
        qDebug() << data[0];
        qDebug() << data[1];

输出

         52685 
         52685 
         13109 
         52685 

暗示数据仅在第一个数组位置更改。另外,我一直认为数组是零初始化的?在这里使用 aQByteArray似乎不起作用,这就是我尝试使用一组quint16(=无符号短裤)的原因。使用循环可能是一种选择,但我试图尽可能避免代价高昂的循环。

那么,如何用文件中的所需数据填充所述数组(数据)?是否可以使用 a 携带数据QByteArray

4

2 回答 2

3

首先,in.size()以字节为单位返回文件的大小,并且由于您使用的是无符号短裤(每个 2 个字节),因此数据数组的大小应该是len/2.

此外,提供 QDataStream 用于序列化目的。这意味着它主要用于一次提取单个对象。有关详细信息,请参阅QDataStrean的文档。

您可以使用以下代码提取整个数组而无需循环或复制:

QFile in(fileName);
in.open(QFile::ReadOnly);
QByteArray byteArray = in.readAll();

quint16 *data = (quint16*) byteArray.data();

如果您只想读取数据但从不修改它,您可以通过将最后一行更改为:

const quint16* data = (const quint16*) byteArray.constData();

但是请记住,使用这个(有些丑陋的)代码,指针只会在 QByteArray 对象的生命周期内有效。这通常意味着您只能使用data到函数结束。

如果您希望您的数据持续更长的时间,您必须分配数组并直接读入它:

QFile in(fileName);
in.open(QFile::ReadOnly);
int len = in.size();

quint16 *data = new quint16[len/2];
in.read((char*)data, len);

这样,您可以访问数据,直到您delete[] data.

最后,要回答您的子问题,只有在全局定义数组时才将数组初始化为零(您甚至不应该依赖它)。出于性能原因,分配有newmalloc永远不会进行零初始化的数组。

于 2013-01-12T19:18:53.990 回答
0

如果您查看 的文档QDataStream,您会发现如果您不想使用循环,还有两种其他方法可供您考虑:

这些问题是它们使用char(字节),而不是quint16你想要的。

我建议使用循环来读取quint16s. 这将是最清晰的代码。并且任何可敬的底层流实现都将从硬件预读到缓冲区中,这样您的许多连续>>调用就不会那么昂贵。

于 2013-01-12T18:54:00.847 回答