2014-10-08 62 views
0

嗨:我試圖在二進制模式下編寫和讀取二維矢量。但是,我沒有得到正確的結果。我的C++代碼如下。任何形式的幫助將不勝感激。C++矢量二進制I/O

#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) 
+0

您能與我們分享您的預期輸出結果嗎? – 2014-10-08 22:39:38

+1

如果size <10',你的程序是否完美工作?如果是這樣,那麼你得到最後一個「正確」的輸出是多少?還要考慮到,當你給出一個問題陳述如*「我沒有得到一個正確的輸出」。*你問的人每天閱讀很多問題不僅要閱讀你的問題,而且要辨別出「正確的」輸出是什麼。這真的有助於做一個[最小示例](http://stackoverflow.com/help/mcve),並告訴我們你的調試道路在哪裏結束,因爲你碰到了一個特定的塊。考慮編輯你的問題來展示你自己在這個問題上的投資。 – HostileFork 2014-10-08 22:41:16

+3

除非您使用實際的二維數組,否則這絕不會奏效。 'std :: vector'通過一個不會包含在二進制輸出中的指針存儲它的數據(除了一些奇蹟般的事故)。但矢量的載體..... – Galik 2014-10-08 22:41:49

回答

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

以爲蒙上是沒有意義的。你必須實際組裝你想寫的字節 - 你不能假裝他們已經在那裏了。

+0

謝謝David Schwartz。 – 2014-10-09 00:45:36

3

令人驚訝的是,它的工作方式和它一樣 - 你在分配子矢量的記憶的方式中很幸運。

而不是

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

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

你需要循環X和Y的子向量和寫入/讀取分開他們;例如

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數組」的子向量並按順序保存,然後按順序讀回它們。

+0

@PinkuNath - 歡迎大家如果你喜歡,請把它標爲答案:) – sfjac 2014-10-09 16:32:19