【问题标题】:c++ operator<< overloading not printing out vectorc++ operator<<重载不打印出向量
【发布时间】:2016-12-17 05:49:27
【问题描述】:

我无法打印出我自己班级的矢量vector&lt;Data&gt; data;

简单地说,我正在研究一个 class Data_proc 类,它在 public 下有一个构造函数:

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

我还为打印重载了operator&lt;&lt;

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

但正如您可能已经猜到的那样,这只会打印出第一个“对”,而从文件中读取的其余数据将被丢弃。我做错什么了?为什么while-loop 不继续从文件中读取?任何帮助表示赞赏!如果您需要有关class Data 的详细信息,请告诉我!

编辑:operator&gt;&gt; 用于数据,我有 string staffNamevector&lt;int&gt; 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;
}

如果还需要输入文件的内容,我可以粘贴一个 sn-p!

编辑 2:为class Data 添加了operator&lt;&lt;

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&gt;&gt;

    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;

【问题讨论】:

  • operator &gt;&gt;Data 在哪里?请发帖minimal reproducible example
  • @PaulMcKenzie 我添加了operator&gt;&gt;。抱歉,代码太长了。
  • @MikelF 你的意思是operator&gt;&gt;main() 中是如何使用的?

标签: c++ operator-overloading istream


【解决方案1】:

在你的operator&gt;&gt;

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

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

【讨论】:

  • 嗯,好的。我给定的输入文件包含第一个字符串,然后是整数,然后重复。我确保 getline() 正在读取字符串,所以在下一个字符串出现之前只剩下整数要读取,对吧?
  • 如果我要读取一行字符串和重复的一行整数,有什么更好的方法?
  • @user3941584:将 getline 用于字符串,然后再次用于整数(即将一行上的所有整数读入一个字符串)。然后使用istringstream 将该字符串读取为一系列整数(与您现在从原始流中执行的方式相同)。
  • 好的。我还在另一篇文章中阅读了您的答案,您提供了类似的解决方案。我还没有让它工作,但我会再试一次。
  • 按照您的建议,我设法打印出了整个系列。奇怪的一件事是,每个整数行打印还包括以前的值。
猜你喜欢
  • 1970-01-01
  • 2020-06-03
  • 2012-01-18
  • 2019-08-08
  • 1970-01-01
  • 2014-11-22
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多