从QDataStream轻松读出到QStringList

时间:2015-04-24 14:41:11

标签: c++ qt c++11 qt5 qt5.4

我正在从二进制文件中读取,并希望插入到QList中。有没有更简单的方法来做到以下几点? (例如在一行中)

QStringList traceNames;

for(qint64 i=0; i<numTraces; i++)
{
  QString name;
  stream >> name;
  traceNames << name;
}

streamQDataStream

我在想traceNames << stream之类的东西(不起作用)。

1 个答案:

答案 0 :(得分:3)

QStringList已实现序列化运算符,但它仅适用于从QStringList开始序列化的数据流。

  QStringList l;
  l << "aaa" << "bbb" << "ccc";
  QBuffer buf;
  QDataStream stream(&buf);
  buf.open(QIODevice::ReadWrite);

  stream << l;
  buf.seek(0);

  QStringList l1;
  stream >> l1;
  qDebug() << l1; // works as expected

以下是序列化QStringList的十六进制转储,其中包含三个测试字符串:

00 00 00 03 00 00 00 06 00 61 00 61 00 61 00 00 00 06 00 62 00 62 00 62 00 00 00 06 00 63 00 63 00 63

这里只有三个测试字符串,没有QStringList

00 00 00 06 00 61 00 61 00 61 00 00 00 06 00 62 00 62 00 62 00 00 00 06 00 63 00 63 00 63

正如您所看到的那样,它们不同,因此您无法从未QStringList序列化的数据流中反序列化QStringList

因此,如果您的二进制文件由序列化QStrings组成,那么您已经找到了最简单的方法。

但是,请注意,除前4个字节外,两个流几乎相同。从技术上讲,您可以将这些字节前置到仅包含QString的数据流中,并将其反序列化为QStringList

  QByteArray rawData;
  QFile f("d:\\serializedStrings.bin");
  f.open(QIODevice::ReadOnly);
  rawData = f.readAll();

  rawData.prepend(QByteArray::fromHex("00000003"));

  QBuffer buf(&rawData);
  QDataStream in(&buf);
  buf.open(QIODevice::ReadOnly);

  QStringList slist;
  in >> slist;
  qDebug() << slist; // it works

虽然这是否有资格证明“简单”是有争议的......还要注意3不是一些幻数,它是字符串列表中的字符串数。这就是你的号码进入的地方。