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:
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:
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 ! :)