c ++运算符<<重载不打印出矢量

时间:2016-12-17 05:49:28

标签: c++ operator-overloading istream

我打印出自己班级的矢量vector<Data> data;时遇到问题。

简单地说,我正在上课class Data_proc,它在公共场合有一个构造函数:

explicit Data_proc(const string& n, istream& is)
{
    Data temp;
    while(is >> temp)
        this->data.push_back(temp);
}

我还要重载operator<<进行打印:

friend ostream& operator<<(ostream& os, const Data_proc& dp)
{
    os << "Person: " << dp.name
       << "\nnumber: " << dp.number;

    copy(dp.data.begin(), dp.data.end(), ostream_iterator<Data>(cout));

    return os;
}

这里的问题是代码编译时没有任何问题,但数据向量中没有任何内容正在打印到控制台。但是,当我按照以下方式更改构造函数时,它可以部分地工作:

    Data temp;
    is >> temp;
    data.push_back(temp);

但正如您可能怀疑的那样,这只打印出第一对#34;并且从文件中读取的其余数据将被丢弃。我做错了什么?为什么while - 循环不继续读取文件?任何帮助表示赞赏!如果您需要有关class Data的详细信息,请与我们联系!

修改:operator>>获取数据,我有string staffNamevector<int> passCode

friend istream& operator>>(istream& is, Data& d)
{
    getline(is, d.staffName, '\n');

    int temp;
    while(is >> temp)
        d.passCode.push_back(temp);

    return is;
}

如果还需要输入文件的内容,我可以粘贴一段代码!

编辑2:为operator<<添加了class Data

friend ostream& operator<<(ostream& os, const Data& d)
{
    os << d.staffName<< "\n";
    copy(d.passCode.begin(), d.passCode.end(), ostream_iterator<int>(cout, " "));
    return os;
}

编辑3:制作新的operator>>

    getline(is, d.staffName, '\n');

    string results;
    getline(is, results, '\n');
    istringstream iss(results);

    int val;
    while(iss >> val)
        d.passCode.push_back(val);

    return is;

1 个答案:

答案 0 :(得分:2)

operator>>

while(is >> temp)
    d.passCode.push_back(temp);

这将从流中读取内容直到失败。因此,无论它是运行到流的末尾,还是直到它尝试读取无法解释为int的内容,当函数结束时,流保证处于失败状态。这意味着在构造函数中,无论文件的内容如何,​​表达式is >> temp都将报告为失败,并且不会将任何项目放入向量中。