Я хотел бы преобразовать следующий фрагмент для использования «простой текст«mimetype, не полагаясь на 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#details
ДОБАВИТЬ
// тащить, тянуть&отбрасывать обычный текст или текст извне приложения «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 (первый шанс)
моя простая / текстовая строка не имеет длины байтов в начале.
Я мог бы запустить его как есть, но мне интересно, смогу ли я определить длину строки заранее.
Всякий раз, когда я пытаюсь читать из потока через << оператор, я не могу просто сбросить его в начале.
Попробуйте изменить код
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 разумного размера для файла.