2017-06-15 93 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