Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1031 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Lecture/Ecriture en binaire de vector

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lecture/Ecriture en binaire de vector

n°2215070
thoslecoyo​te
Posté le 05-01-2014 à 23:33:23  profilanswer
 

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
mood
Publicité
Posté le 05-01-2014 à 23:33:23  profilanswer
 

n°2215074
Farian
Posté le 06-01-2014 à 00:18:47  profilanswer
 

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 !

n°2215076
thoslecoyo​te
Posté le 06-01-2014 à 09:17:28  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Lecture/Ecriture en binaire de vector

 

Sujets relatifs
[JAVA] Suppression dans un arbre binaire ordonnéOptimisation lecture fichier texte
Fortran : Probleme de lectureProgrammation Java lecture base de données
Violation d'accès lors de la lecture de l'emplacement 0x0000001cintialisation d'un Vector
Programme qui affiche la musique en cours de lectureProjet de lecture RFID + GUI
exercice arbre binaire de rechercheConseils écriture Bibliothèque
Plus de sujets relatifs à : Lecture/Ecriture en binaire de vector


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR