Pinku Nath
Pinku Nath

Reputation: 11

C++ vector binary I/O

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

Answers (2)

sfjac
sfjac

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

David Schwartz
David Schwartz

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

Related Questions