2017-06-15 106 views
-2

我無法顯示全部我已經讀取二進制文件內容的矢量的內容。我可以訪問此矢量的各個元素,但不能打印所有這些元素。我的代碼去如下:將二進制文件的內容讀入對象矢量

BankSystem::BankSystem(string file_name) { 
    vec_acc.reserve(10); 
    fstream acc_file(file_name, ios::in | ios::out | ios::binary); 
    for(int i=0; i<10; i++) { 
     acc_file.seekg(sizeof(Account)*i); 
     acc_file.read((char*)&vec_acc[i], sizeof(Account)); 
    } 
    acc_file.close(); 
} 

所以該構造是假設讀取二進制文件的內容爲Account載體。

我知道數據已被正確讀入Account載體中,因爲我可以在其上執行方法功能,如getNamegetBalance。然而,當我嘗試顯示向量的內容:

void BankSystem::showAccounts() { 
    std::copy(vec_acc.begin(), vec_acc.end(), std::ostream_iterator<Account> 
    (cout, " ")); 
} 

這以前工作時,我推了Account對象到載體。但是,由於我已經添加了從二進制文件中將內容讀入矢量的功能,所以我無法使其工作。

+0

「Account」包含什麼? – Galik

+3

是否是POD?在你的代碼中進行下面的編譯:'static_assert(std :: is_pod :: value,「Account must be POD。」);' – marcinj

+0

@Galik我很困惑你正在問什麼。它包含7個方法函數,6個數據成員和一個重載的'operator'。 'ostream&operator <<(ostream&os,const Account&acc){os <<「Account(Name:」<< acc.firstName +''+ acc.lastName <<「,Account Number:」<< acc.acc_num << 「)」;返回操作系統} – quantik

回答

1

你做vec_acc.reserve(10);但你的vec_acc.size()仍然是0和你的vec_acc.begin() == vec_acc.end()

但即使您將其更改爲.resize(10)您可能會遇到以這種方式序列化非POD類型對象的問題。

+0

我不相信這是問題的根源,因爲當我將'Account'對象推入'vec_acc'時,我使用'reserve'並且代碼工作得非常好。但是,是的,這就是爲什麼我沒有使用'resize'並不確定如何避免這個問題。 – quantik

+2

將元素推入矢量中時,矢量大小會增加。當你訪問'vec_acc [i]'而不調整你的UB(可能會崩潰或更糟糕)。 – Paul

相關問題