thoslecoyote | 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 . Mais ça ne marche point ...
Code :
- #include <iomanip>
- #include<iostream>
- #include<fstream>
- #include<math.h>
- #include <vector>
- using namespace std;
- int main(int argc, char *argv[])
- {
- int n = 3, m = 5;
- std::vector<std::vector<double> > t1(n, std::vector<double>(m)),t2(n, std::vector<double>(m));
- double cpt = 0.;
- for (int i = 0; i < n; i++)
- for (int j = 0 ; j < m ; j++, cpt++)
- t1[i][j] = cpt;
- //écriture sur disque de t1
- std::ofstream fin("truc", ios::binary);
- fin.write((char *)&t1[0][0], m*n*sizeof(double));
- fin.close();
- //lecture sur disque dans t2
- std::ifstream fout ("truc", ios::binary);
- fout.read((char *)&t2[0][0], n*m*sizeof(double));
- fout.close();
- //comparaison
- for (int i = 0; i < n; i++)
- for(int j = 0 ; j< m ; j++)
- printf("t1[%d][%d]=%g, t2[%d][%d]=%g\n", i,j, t1[i][j], i,j, t2[i][j]);
- return 0;
- }
|
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 :
- for (int i = 0; i < n ; i++)
- fin.write((char *)&t1[i][0], m*sizeof(double));
- ...
- for (int i = 0; i < n ; i++)
- 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
|