Проблема с QDataStream & QDataStream::operator>> ( char *& s)

 QFile msnLogFile(item->data(Qt::UserRole).toString());
 QDataStream logDataStream;
    if(msnLogFile.exists()){
        msnLogFile.open(QIODevice::ReadOnly);
        logDataStream.setDevice(&msnLogFile);
        QByteArray logBlock;
        logDataStream >> logBlock;
    }

Этот код не работает. QByte, который в результате пуст. То же самое, если я использую символ * . Достаточно странно, что тот же код работает в другой программе. Я пытаюсь найти разницу между ними. Это работает, если я использую int,uint, quint8 и т. Д.

2 ответа

Решение

Предполагая, что msnLogFile не был ранее создан с использованием QDataStream (если это так, то полностью игнорируйте этот ответ), вы не хотите использовать оператор >>.

Причина в том, что когда QDataStream пишет строки, он добавляет длину строки в выходные байты. Это позволяет другому QDataStream считывать его обратно с правильной длиной и получать тот же результат. Следовательно, почему int, qint8 и т. Д. Работают правильно; нет предопределенного размера, это просто необработанные данные.

Если содержимое msnLogFile строго текстовое, вам нужно передать флаг QIODevice::Text, чтобы открыть и использовать QIODevice::readLine() или QIODevice:: readAll (), однако, если это двоичные данные, вам придется использовать QDataStream::readRawData() и считывание данных в правильном порядке с правильными размерами.

Рискну предположить, что это потому, что вы не указываете версию протокола. Вам следует позвонить setVersion() чтобы убедиться, что несколько компьютеров, которые могут использовать разные версии Qt, используют одну и ту же версию протокола.

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