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

Ce code ne fonctionne pas. Le QByte qui en résulte est vide. Même chose si j'utilise un caractère *. Curieusement, le même code fonctionne dans un autre programme. Im attachant pour trouver la différence entre les deux. Cela fonctionne si j'utilise int, uint, quint8, etcproblème avec QDataStream & QDataStream :: opérateur >> (char * & s)

Répondre

2

En supposant que msnLogFile n'a pas été créé précédemment à l'aide d'un QDataStream (si tel était le cas, ignorez complètement cette réponse), vous ne voulez pas utiliser l'opérateur >>.

La raison est que lorsque QDataStream écrit des chaînes, il ajoute la longueur de la chaîne aux octets de sortie. Cela permet à un autre QDataStream de le relire avec la bonne longueur et d'obtenir le même résultat. Par conséquent, pourquoi int, qint8, etc fonctionnent correctement; il n'y a pas de taille ajoutée, c'est juste les données brutes.

Si le contenu de msnLogFile sont strictement texte, vous devez passer le drapeau QIODevice::Text pour ouvrir et utiliser QIODevice::readLine() ou QIODevice::readAll(), si ses données binaires que vous auriez à utiliser QDataStream::readRawData() et relire les données dans l'ordre correct avec des tailles correctes.

1

Je suppose que c'est parce que vous ne spécifiez pas la version du protocole. Vous devez appeler le setVersion() pour vous assurer que plusieurs machines, qui peuvent utiliser différentes versions de Qt, utilisent toutes la même version de protocole.

Questions connexes