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 !