Reputation: 11
Hi: I was trying to write and read a 2D vector in binary mode. But, I am not getting a right output. My C++ code is as follow. Any kind of help will be appreciated.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <complex>
using namespace std;
int main()
{
typedef unsigned uint;
typedef complex<double> TYPE;
uint size=10;
uint datasize=size*size*sizeof(TYPE);
vector<vector<TYPE> > X(size, vector<TYPE> (size));
for(uint i = 0 ; i < X.size() ; ++i ){
for(uint j = 0 ; j < X.size() ; ++j ){
X[i][j]={(double)i, (double)j};}}
for(uint i = 0 ; i < X.size() ; ++i ){
for(uint j = 0 ; j < X.size() ; ++j ){
cout << X[i][j] << ' ';}
cout << std::endl;}
ofstream o("out.bin",ios_base::binary);
o.write( (char *)(&X[0][0]), datasize );
o.clear();
o.close();
cout<<"**************************************"<<std::endl;
vector<vector<TYPE> > Y(size, vector<TYPE> (size));
streampos begin, end;
ifstream in("out.bin",ios_base::binary);
in.read( (char *)(&Y[0][0]), datasize);
in.clear();
in.close();
for(uint i = 0 ; i < Y.size() ; ++i ){
for(uint j = 0 ; j < Y.size() ; ++j ){
cout << Y[i][j] << ' ';}
cout << std::endl;}
return 0;
}
output
(0,0) (0,1) (0,2) (0,3) (0,4) (0,5) (0,6) (0,7) (0,8) (0,9)
(1,0) (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9)
(2,0) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (2,9)
(3,0) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9)
(4,0) (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (4,9)
(5,0) (5,1) (5,2) (5,3) (5,4) (5,5) (5,6) (5,7) (5,8) (5,9)
(6,0) (6,1) (6,2) (6,3) (6,4) (6,5) (6,6) (6,7) (6,8) (6,9)
(7,0) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) (7,8) (7,9)
(8,0) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (8,8) (8,9)
(9,0) (9,1) (9,2) (9,3) (9,4) (9,5) (9,6) (9,7) (9,8) (9,9)
**************************************
(0,0) (0,1) (0,2) (0,3) (0,4) (0,5) (0,6) (0,7) (0,8) (0,9)
(1,0) (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (1,9)
(2,0) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) (2,9)
(3,0) (3,1) (3,2) (3,3) (3,4) (3,5) (3,6) (3,7) (3,8) (3,9)
(4,0) (4,1) (4,2) (4,3) (4,4) (4,5) (4,6) (4,7) (4,8) (4,9)
(5,0) (5,1) (5,2) (5,3) (5,4) (5,5) (5,6) (5,7) (5,8) (5,9)
(6,0) (6,1) (6,2) (6,3) (6,4) (6,5) (6,6) (6,7) (6,8) (6,9)
(7,0) (7,1) (7,2) (7,3) (7,4) (7,5) (7,6) (7,7) (7,8) (7,9)
(8,0) (8,1) (8,2) (8,3) (8,4) (8,5) (8,6) (8,7) (8,8) (8,9)
(9,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0) (0,0)
Upvotes: 0
Views: 1209
Reputation: 7313
Surprising it worked as well as it did - you were lucky in the way the memory of the sub-vectors was allocated.
Instead of
o.write( (char *)(&X[0][0]), datasize );
and
in.read( (char *)(&Y[0][0]), datasize);
You'll need to loop over the sub-vectors of X and Y and write/read them separately; e.g.
for (size_t i = 0; i < size; ++i) {
o.write( (char *)(&X[i][0]), size*sizeof(TYPE) );
}
and
for (size_t i = 0; i < size; ++i) {
o.read( (char *)(&Y[i][0]), size*sizeof(TYPE) );
}
Only the sub-vectors have memory that is contiguous. These loops go through the sub-vectors of each "2-D array" and save them in order, and then read them back in order.
Upvotes: 3
Reputation: 182893
o.write( (char *)(&X[0][0]), datasize );
That cast makes no sense. You have to actually assemble the bytes you want to write -- you can't just pretend they're already there.
Upvotes: 1