Bonjour à toutes et à 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 ...
Cha me donne ça :
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 #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; }
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 :
Et ça semble fonctionner (ouf). Que la première version ne fonctionne pas, ne m'étonne et ne m'émeut qu'à moitié. Toutefois, je pensais que si elle ne marcherait pas, cela serait du au fait que les sous-vecteurs d'un vecteur ne sont pas forcément contigus en mémoire (??), mais alors pourquoi mon petit code naif retrouve toutes les bonnes valeurs sauf les deux dernières...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ... 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));
Plus précisément, pourquoi t1[2][0], t1[2][1] et t1[2][2] sont ok, mais pas les deux suivantes, appartenant pourtant au même vecteur (et donc de valeurs contiguës en mémoire).
Bref, si quelqu'un a une explication, je lui en serai très reconnaissant
Merci d'avance, et bonne fin de journée !
PS : un fichier écrit en binaire de données (par ex. des double), prend bien moins de place disque qu'en ascii ? ou juste un peu moins ? ou kiff-kiff bourriquot ?
Partager