Lecture/Ecriture en binaire de vector

Lecture/Ecriture en binaire de vector - C++ - Programmation

Marsh Posté le 05-01-2014 à 23:33:23    

Bonjour à tous et bonne année !
 
J'ai une petite question de novice sur la lecture/écriture sur fichier binaire de vecteurs à deux dimension (voire même une seule en fait). J'ai fait un chtit code tout con qui affiche un vecteur, l'écrit dans un fichier en binaire, relit le fichier, et re-affiche le vecteur ainsi lu. En espérant obtenir la même chose logiquement [:chrisbk]. Mais ça ne marche point ...
 
 

Code :
  1. #include <iomanip>
  2. #include<iostream>
  3. #include<fstream>
  4. #include<math.h>
  5. #include <vector>
  6. using namespace std;
  7. int main(int argc, char *argv[])
  8. {
  9.   int n = 3, m = 5;
  10.   std::vector<std::vector<double> > t1(n, std::vector<double>(m)),t2(n, std::vector<double>(m));
  11.   double cpt = 0.;
  12.   for (int i = 0; i < n; i++)
  13.       for (int j = 0 ; j < m ; j++, cpt++)
  14.   t1[i][j] = cpt;
  15. //écriture sur disque de t1
  16.   std::ofstream fin("truc", ios::binary);
  17.   fin.write((char *)&t1[0][0], m*n*sizeof(double));
  18.   fin.close();
  19. //lecture sur disque dans t2
  20.   std::ifstream fout ("truc", ios::binary);
  21.   fout.read((char *)&t2[0][0], n*m*sizeof(double));
  22.   fout.close();
  23. //comparaison
  24.   for (int i = 0; i < n; i++)
  25.     for(int j = 0 ; j< m ; j++)
  26.       printf("t1[%d][%d]=%g, t2[%d][%d]=%g\n", i,j, t1[i][j], i,j, t2[i][j]);
  27.   return 0;
  28. }


 
Cha me donne ça :
 
t1[0][0]=0, t2[0][0]=0
t1[0][1]=1, t2[0][1]=1
t1[0][2]=2, t2[0][2]=2
t1[0][3]=3, t2[0][3]=3
t1[0][4]=4, t2[0][4]=4
t1[1][0]=5, t2[1][0]=5
t1[1][1]=6, t2[1][1]=6
t1[1][2]=7, t2[1][2]=7
t1[1][3]=8, t2[1][3]=8
t1[1][4]=9, t2[1][4]=9
t1[2][0]=10, t2[2][0]=10
t1[2][1]=11, t2[2][1]=11
t1[2][2]=12, t2[2][2]=12
t1[2][3]=13, t2[2][3]=0
t1[2][4]=14, t2[2][4]=0

D'où ma déception : certains nombres sont partis à l'as. j'ai tenté en splittant les deux dimensions du vecteur, c'est à dire :

Code :
  1. for (int i = 0; i < n ; i++)
  2.     fin.write((char *)&t1[i][0], m*sizeof(double));
  3. ...
  4.   for (int i = 0; i < n ; i++)
  5.     fout.read((char *)&t2[i][0], m*sizeof(double));


Mais parfois ça ne marchait pas, dans le sens où le résultat obtenu était aussi biaisé (des zéros qui apparaissent, mais je n'arrive plus à reproduire le cas ... du coup ptete j'avais fait n'importe quoi)
 
J'ai donc deux petites questions :
- Est-ce que je m'y prends comme un branquignol ?
- Est-ce normal que ça ne marche pas ?
-- Si oui, je croyais que les std::vector occupait de la mémoire contigue, mais ceci n'est valable que pour un vector et non un vector de vector ? (enfin, par exemple, t1[0][0], t1[0][1], ..., t1[0][n-1] sont contigues en mémoire mais pas forcément t1[0][n-1] et t1[1][0] ?)
 
Merci d'avance !!


Message édité par thoslecoyote le 05-01-2014 à 23:34:40
Reply

Marsh Posté le 05-01-2014 à 23:33:23   

Reply

Marsh Posté le 06-01-2014 à 00:18:47    

Bonsoir !
 
Pour la dernière question, c'est exactement ça : le vector stocke des informations internes, la seule chose qui est garantie, c'est que les données sont stockées de manière contigüe à partir de la première valeur, il est donc normal que votre premier exemple ne fonctionne pas (sauf pour le premier vecteur).
 
Par contre, à vue de nez, en en tenant compte de l'heure tardive qui ralentit mon cerveau et me fait peut-être rater un truc évident, le deuxième bout de code, en "splittant" les deux dimensions, paraît correct, et devrait marcher dans tous les cas.
 
Bonne continuation !

Reply

Marsh Posté le 06-01-2014 à 09:17:28    

Hello,
 
merci beaucoup pour ta réponse !
 
Il reste quelque chose qui me taraude... Les valeurs qui sont erronées ne se situent pas à "l'intersection" entre deux sous-vecteurs, mais dans un des sous-vecteurs, là où la mémoire est sensée être contigue...
Par exemple ici :
 
t1[2][0]=10, t2[2][0]=10
t1[2][1]=11, t2[2][1]=11
t1[2][2]=12, t2[2][2]=12
t1[2][3]=13, t2[2][3]=0
t1[2][4]=14, t2[2][4]=0
 
Le code a bien retrouvé les bonnes valeurs de t1[2][0], t1[2][1] et t1[2][2], mais pas les deux suivantes t1[2][3] et t1[2][4], qui auraient du être contigues (en mémoire) aux trois précédentes ...
Je veux dire, je serais moins surpris si, par exemple, on aurait eu une valeur fausse lors du changement du premier indice (par exemple de t1[1][4] à t1[2][0]) plutôt qu'à "l'intérieur" d'un sous-vecteur... :)
 
J'imagine qu'il y a un truc que je comprends mal... (ou ptete c'est un coup de chance qu'autant de valeurs soient correctement retrouvées) :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed