"Plain/text" encodedData и QDataStream для удобочитаемой QString

Я хотел бы преобразовать следующий фрагмент кода для использования mimetype "plain / text", не полагаясь на QTextStream

 bool DragDropListModel::dropMimeData(const QMimeData *data,
           Qt::DropAction action, int row, int column, const QModelIndex &parent)
 {
  ...
  QByteArray encodedData = data->data("application/vnd.text.list");
  QDataStream stream(&encodedData, QIODevice::ReadOnly);
  QStringList newItems;

  while (!stream.atEnd()) {
   QString text;
   stream >> text;
   newItems << text;
  }
  ...
 }

Я пытался применить сказанное при разборе строки Qt неопределенного размера из потока двоичных данных

 char *ch;
 QFile file("file.dat")
 file.open(QIODevice::ReadOnly);
 QDataStream in(&file)
 in >> ch;
 QString str(ch);

и http://www.qtcentre.org/threads/696-QDataStream-reading-into-QString

 stream.setByteOrder( QDataStream::BigEndian);
 ...
 quint16 id;
 stream >> id;  // First two bytes
 char* filename;
 stream >> filename; // String of undefined size
 QString file = QString::fromLatin1(filename);
 qDebug() << "output: " << file;
 newItems << file;
 delete[] filename; //cleanup

но я всегда получаю пустую строку или 0. Я читаю, что "Единственный недостаток использования QDataStream (по сравнению с QTextStream) состоит в том, что результирующий файл является двоичным (то есть не читаемым человеком)". Нет ли способа конвертировать QDataStream простого текста в читаемую QString?

Аналогично QT QString из QDataStream, но я хотел бы читать двоичные данные из потока через цикл и оператор << (косвенный метод).

Документация по адресу http://qt-project.org/doc/qt-5/qdatastream.html


ДОБАВИТЬ

// перетаскиваем обычный текст / текст из-за пределов приложения "abcdefg"

while (!stream.atEnd()) {
    char* a;
    stream.readRawData(a, 7); // abcdefg length = 7
    QString string(a);
    qDebug() << "output " << string; // WORKING => abcdefg
}

скажем, я пишу следующий код перед циклом while:

quint8 v;
stream >> v;
qDebug() << "output: " << v; // => 97 = "a"

что эквивалентно

quint8 v;
stream >> v;
QString a;
qDebug() << "output: " << static_cast<char>(v); // => "a"

и цикл while вылетает:
ошибка: исключение в 0x5dd02907, код: 0xc0000005: нарушение прав на чтение в: 0x0, флаги =0x0 (первый шанс)

моя простая / текстовая строка не имеет длины байтов в начале. Я мог бы запустить его как есть, но мне интересно, смогу ли я определить длину строки заранее. Всякий раз, когда я пытаюсь прочитать из потока через оператор <<, я не могу просто сбросить его в начало.

1 ответ

Попробуйте изменить код

char *ch;
QFile file("file.dat")
file.open(QIODevice::ReadOnly);
QDataStream in(&file)
in >> ch;
QString str(ch);

использовать char buf[BUF_SIZE] вместо char *ch, с BUF_SIZE разумного размера для файла.

Другие вопросы по тегам