2016-11-22 5 views
0

Je suis en train de programmer un outil dans Qt dans lequel je veux écrire des données binaires dans un fichier. Tout fonctionne bien sauf lorsque j'essaie d'écrire la valeur décimale '10' (0000 1010 en binaire) dans le fichier. dans ce cas, je reçois un octet supplémentaire avec la valeur '0000 1101' devant l'autre octet. Peu importe combien de données j'écris dans le fichier, dès que j'écris un 10, je reçois un autre octet.écrire 00001010 à Qfile ajoute un autre octet à l'avant

je me suis cassé vers le bas le code suivant:

#include <QCoreApplication> 
#include <QFile> 
#include <iostream> 
#include <QString> 
#include <QDataStream> 

int main(int argc, char *argv[]) 
{ 
QCoreApplication a(argc, argv); 

QString SavePath; 
SavePath = qApp->applicationDirPath(); 
SavePath.append("/test.bin"); 

QFile file(SavePath.toLocal8Bit().constData()); 
if (file.exists()) 
    file.remove(); 
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) 
{ 
    std::cout << "Kann Datei zum Speichern der TP-Daten nicht erstellen." << std::endl; 
    std::cout << SavePath.toLocal8Bit().constData() << std::endl; 
    return -1; 
} 


QDataStream out(&file); 
out.setVersion(QDataStream::Qt_4_3); 
out.setByteOrder(QDataStream::LittleEndian); 
out << qint32(10); 

int test=10; 
out.writeRawData((char*)&test,4); 

file.write((char*)&test); 

return 1; 
} 

La sortie dans mon fichier est:

0d 0a 00 00 00 0d 0a 00 00 00 0d 0a 

les trois octets 0x0D sont indésirables. Je ne les obtiens pas en écrivant un '9' ou un '11' dans le fichier. Je manque d'idées. Quelqu'un peut-il me dire ce que je fais mal?

+0

La surcharge ['QFile :: write'] (http://doc.qt.io/qt-5/qiodevice.html#write-1) que vous appelez attend un tableau de caractères à terminaison nulle. Votre code affichera un comportement indéfini. –

+0

Merci pour votre réponse! –

Répondre

3

Si vous voulez un fichier binaire, supprimez QIODevice :: Text flag, mec. Sinon, il ajoute le symbole CR (0x0D) au symbole LF (0x0A) dans Windows.

0

Juste résolu le problème dans le forum Qt:

en ajoutant QIODevice :: Drapeau de texte dans la fonction ouverte je l'ai fait un fichier texte. Après la suppression de tout cela fonctionne très bien.

+0

J'essaie de comprendre votre pensée: vous avez sans doute consciemment ajouté le drapeau 'Text' dans un fichier * binaire * ... :) –