проблема с QDataStream & QDataStream :: operator >> (char * & s) - PullRequest
1 голос
/ 22 апреля 2010
 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 ]

3 голосов
/ 23 апреля 2010

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

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

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

1 голос
/ 22 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...