IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Problème lecture binaire QDataStream


Sujet :

Qt

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 72
    Points : 62
    Points
    62
    Par défaut Problème lecture binaire QDataStream
    Bonjour,

    Je fais un programme qui doit lire des fichiers binaires. J'ai codé une version qui utilise les techniques C (FILE* et fread()) et ça fonctionnait bien.

    Les fichiers ne devant pas être modifiés, j'ai voulu les intégrer dans mes ressources Qt pour ne pas avoir à les trimbaler (il y en a 50) lors du déploiement de l'application. Maintenant je les lis avec QFile et QDataStream, et j'obtiens des différences

    version C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #define READ( file, type, var ) {\
    					size_t taille = sizeof(type);\
    					M_BYTE *buffer = new M_BYTE[taille];\
    					fread(buffer, taille, 1, file );\
    					memcpy_s(&var, taille, buffer, taille );\
    					delete[] buffer ;}
     
    #define READ_ARRAY( file, type, tab, length ) {\
    					size_t taille = sizeof(type);\
    					M_BYTE *buffer = new M_BYTE[length*taille];\
    					fread(buffer, length*taille, 1, file );\
    					memcpy_s(tab, length*taille, buffer, length*taille );\
    					delete[] buffer ;}
     
    typedef char M_BYTE ;
     
    //-----------------------------------------------------------
    QPixmap
    RROLevel::preview( const string & adresseFichier, const QSize & widgetSize )
    {
    	FILE *file ;
     
    	// adresseFichier : "c:/monProgramme/internals/QWQUU006.LEV"
     
    	if( fopen_s( &file, adresseFichier.c_str(), "rb" )==0 )
    	{
    		// Read file header :
    		M_BYTE header[130] ;
    		READ_ARRAY( file, M_BYTE, header, 130 ) ;
    		// header : "POT14¾¦¾¦”5¡´"
     
    		double dnbPolygons ;
    		READ( file, double, dnbPolygons ) ;
    		// dnbPolygons : 19.464364300000000
     
    		//...
    	}
    }
    }
    version Qt (attention, c'est le jeu des 7 différences)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #define READ( file, var )	file >> var
     
    #define READ_ARRAY( file, tab, length ) \
    					for(short _idx=0;_idx<length; _idx++)\
    						file >> tab[_idx] ;
     
     
     
    typedef qint8 M_BYTE ;
     
    //-----------------------------------------------------------
    QPixmap
    RROLevel::preview( const QString & adresseFichier, const QSize & widgetSize )
    {
    	QFile file( adresseFichier ) ;
     
    	// adresseFichier : ":internals/qwquu006.lev"
    	// les ressources Qt semblent sensibles à la casse contrairement
    	// à l'ouverture de fichier en C; c'est pour ça que les noms de fichiers
    	// ne sont pas identiques dans les 2 versions
     
    	if( file.open( QIODevice::ReadOnly )==true )
    	{
    		QDataStream stream( &file ) ;
     
    		M_BYTE header[130] ;
    		READ_ARRAY( stream, header, 130 ) ;
    		char buff[130] ;
    		memcpy( &buff, &header, 130*sizeof(char) ) ;
    		// header : "POT14¾¦¾¦”5¡´"
     
    		double dnbPolygons ;
    		READ( stream, dnbPolygons ) ;
    		// dnbPolygons : 3.9788684400173439e-227
     
    		//...
    	}
    }
    voilà je me demande donc pourquoi la lecture du double 'dnbPolygons' ne donne pas le même résultat ?

    Est-ce que le fait d'intégrer un fichier dans une QResource le compresse ?

    merci à ceux qui jeteront un coup d'oeil à ce problème !

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut (tiens un rennais)
    je parie sur
    http://qt.developpez.com/doc/4.4/qda.../#setbyteorder

    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy( &buff, &header, 130*sizeof(char) ) ;
    pourquoi &buff et &header ??? Peut être que je me trompe mais pour moi ça fait une erreur mémoire

    Au lieu de memcpy, il faut mieux utilise std::copy. Beaucoup plus propre en C++.

  3. #3
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Moi je penche aussi comme Yan pour un problème d'ENDIAN.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 72
    Points : 62
    Points
    62
    Par défaut
    Eh bien merci, bravo

    C'était LittleEndian, le programme remarche parfaitement comme avant

    messieurs merci encore - c'est une résolution de bug très appréciée

    bonne soirée !






    hors-sujet :

    pourquoi &buff et &header ???
    je sais pas trop, peut etre parceque le qint8 me donnait des erreurs de compilation... mais bon ça marche et j'ai plein de trucs à faire, alors je vais laisser comme ça


    il faut mieux utilise std::copy
    ok je vais essayer ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lecture de fichier binaire
    Par -N4w4k- dans le forum C#
    Réponses: 3
    Dernier message: 16/02/2013, 22h16
  2. Problème lecture fichier binaire
    Par santino2008 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 19/03/2010, 19h13
  3. probléme lecture de fichier binaire octer par octet
    Par ousmanesidibe dans le forum C++
    Réponses: 2
    Dernier message: 12/12/2009, 21h34
  4. [debutant] problème lecture fichier binaire
    Par julien.63 dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2007, 22h12
  5. [Lecture binaire] Problème de conversion
    Par poukill dans le forum C++
    Réponses: 2
    Dernier message: 14/09/2007, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo