C ++向量二进制I / O.

时间:2014-10-08 22:32:56

标签: c++ c++11

嗨:我试图以二进制模式写入和读取2D矢量。但是,我没有得到正确的输出。我的C ++代码如下。任何形式的帮助将不胜感激。

#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;
    }

输出

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

2 个答案:

答案 0 :(得分:3)

令人惊讶的是它的效果和它一样 - 你很幸运地分配了子向量的内存。

而不是

o.write( (char *)(&X[0][0]), datasize );

in.read( (char *)(&Y[0][0]), datasize);

你需要循环遍历X和Y的子向量并分别写入/读取它们; e.g。

for (size_t i = 0; i < size; ++i) {
    o.write( (char *)(&X[i][0]), size*sizeof(TYPE) );
}

for (size_t i = 0; i < size; ++i) {
    o.read( (char *)(&Y[i][0]), size*sizeof(TYPE) );
}

只有子向量具有连续的内存。这些循环遍历每个“2-D数组”的子向量并按顺序保存它们,然后按顺序读回它们。

答案 1 :(得分:1)

 o.write( (char *)(&X[0][0]), datasize );

那个演员毫无意义。你必须实际组装你想要写的字节 - 你不能假装他们已经在那里。