moumout511 | Le programme ci-dessous permet de tester le problème de l’endian et de l’hypothétique problème d’incompatibilité de fonctions du C incorporés dans un projet C++ :
Code :
- #include "stdafx.h"
- #include <cstdio>
- #include <iostream>
- #include <fstream>
- #include <algorithm>
- using namespace std;
- #define ByteSwap5(x) ByteSwap((unsigned char *) &x,sizeof(x))
- void ByteSwap(unsigned char * b, int n)
- {
- register int i = 0;
- register int j = n-1;
- while (i<j)
- {
- swap(b[i], b[j]);
- i++, j--;
- }
- }
- int main(int argc, char* argv[])
- {
- FILE *fp;
- fp = fopen("C:\\Documents and Settings\\Ludo\\Bureau\\ezdata\\sample\\sample1.ezd","rb" );
- if (!fp)
- {
- printf("Probleme d'ouverture de fichier\n" );
- }
- else
- {
- char Name1[100];
- time_t Time1;
- float StepX1, StepY1, XStart1;
- long Number1;
- fread(Name1, sizeof(char), 100, fp);
- fread(&Time1, sizeof(time_t), 1, fp);
- fread(&StepX1, sizeof(float), 1, fp);
- fread(&StepY1, sizeof(float), 1, fp);
- fread(&XStart1, sizeof(float), 1, fp);
- fread(&Number1, sizeof(long), 1, fp);
- fclose(fp);
- cout<<"Test avec fread:"<<endl;
- cout<<"Name="<<Name1<<endl;
- cout<<"Time="<<Time1<<endl;
- cout<<"StepX="<<StepX1<<endl;
- cout<<"StepY="<<StepY1<<endl;
- cout<<"XStart="<<XStart1<<endl;
- cout<<"Number="<<Number1<<endl;
- }
- ifstream f("C:\\Documents and Settings\\Ludo\\Bureau\\ezdata\\sample\\sample1.ezd",ios::in|ios::binary);
- if(!f.is_open())cout<<"Impossible d'ouvrir le fichier en lecture !"<<endl;
- else
- {
- char Name2[100];
- time_t Time2;
- float StepX2, StepY2, XStart2;
- long Number2;
- for(size_t i=0;i<100;i++){f.read((char *)&Name2[i],sizeof(char));}
- f.read((char *)&Time2,sizeof(time_t));
- f.read((char *)&StepX2,sizeof(float));
- f.read((char *)&StepY2,sizeof(float));
- f.read((char *)&XStart2,sizeof(float));
- f.read((char *)&Number2,sizeof(long));
- f.close();
- cout<<"Test avec ifstream::read:"<<endl;
- cout<<"Name="<<Name2<<endl;
- cout<<"Time="<<Time2<<endl;
- cout<<"StepX="<<StepX2<<endl;
- cout<<"StepY="<<StepY2<<endl;
- cout<<"XStart="<<XStart2<<endl;
- cout<<"Number="<<Number2<<endl;
- ByteSwap5(Time2);
- ByteSwap5(StepX2);
- ByteSwap5(StepY2);
- ByteSwap5(XStart2);
- ByteSwap5(Number2);
- cout<<"Swap:"<<endl;
- cout<<"Time="<<Time2<<endl;
- cout<<"StepX="<<StepX2<<endl;
- cout<<"StepY="<<StepY2<<endl;
- cout<<"XStart="<<XStart2<<endl;
- cout<<"Number="<<Number2<<endl;
- }
-
- return 0;
- }
|
Résultats:
Test avec fread:
Name=__ezGet.net dataFormat 5__This is the <u>native data</u> for ezDatar.
<font size='+4'>Now</font>, yo╠╠╠╠╠╠╠╠`↔1►╠╠╠╠üÏ■9¿ ↕
Time=8319591545089237109
StepX=8.67581e+020
StepY=4.51558e+027
XStart=0.0140029
Number=540959279
Test avec ifstream::read:
Name=__ezGet.net dataFormat 5__This is the <u>native data</u> for ezDatar.
<font size='+4'>Now</font>, yo╠╠╠╠╠╠╠╠PrQ►♦
Time=8319591545089237109
StepX=8.67581e+020
StepY=4.51558e+027
XStart=0.0140029
Number=540959279
Swap:
Time=8439854971802908019
StepX=4.72933e+022
StepY=0.237707
XStart=2.92643e+029
Number=794967584
Appuyez sur une touche pour continuer...
Ce test montre que pour les fonctions du C et les méthodes du C++ renvoient les mêmes valeurs, sauf pour la chaîne de caractères (???). Le swap des bits ne change rien, les valeurs sont toujours aussi catastrophiques... |