【问题标题】:Overloading cin >> operator skipping a line of input重载 cin >> 运算符跳过一行输入
【发布时间】:2014-10-14 13:33:04
【问题描述】:

我在这里给出了我的代码的一个简短和通用的截图。我正在尝试重载 >> 运算符,并且不希望我的 cin 在空白处终止。
由于某种原因,它没有将第一个输入作为第一个属性的预期输入。我不确定它是如何确定成本的,它确实有所不同,我怀疑可能是一些 ASCII 转换。我并不那么担心,好像我可以让它接受第一个输入作为第一个值,我将有机会为三个不同的属性输入三次。

我相信这对有经验的程序员来说是直截了当的,我只是新手,谢谢。

class MyObject  
{    
protected:
    string length;
    string width;
    float cost;

public:
    friend ostream& operator<<(ostream& output, const MyObject& _myObject);
    friend istream& operator>>(istream& input, MyObject& _myObject);
}

istream& operator>>(istream& input, MyObject& _myObject)
{
    cout << "Enter Length, zones and cost:" << endl;
    std::getline(input, _myObject.length);
    std::getline(input, _myObject.width);
    input >> _myObject.cost;
    return input;
}

ostream& operator<<(ostream& output, const MyObject& _myObject)
{
    cout.precision(2);
    output << "Length is: " << _myObject.length << "\nWidth is: " << _myObject.width << "\nCost is : $" << fixed << _myObject.cost << endl;
    return output;
}

这个长度
这个宽度

直接输出:

长度是:
宽度是:这个长度
费用:2.50 美元

请在我的输出中注意,我使用的是区域而不是宽度:

【问题讨论】:

  • I can't reproduce。显示真实的输入文件(因为例如在您的输入中没有2.50)。
  • @AntonSavin:从问题来看,他的输入也没有:“我不确定它是如何确定成本的,它确实有所不同,我怀疑可能是一些 ASCII 转换。”
  • 注意:cout.precision(2); 应该使用output,而不是cout,对吧?
  • @user3956566 尝试使 MCVE, here is another demo 从文件中获取输入。如果你愿意,可以编辑它。

标签: c++ operator-overloading cin


【解决方案1】:

您的问题很可能与流的先前状态有关。如果缓冲区中有剩余的换行符,第一个 getline 将找到它并完成。

使用std::getline(input &gt;&gt; ws, _myObject.length); 丢弃前导空格。

【讨论】:

  • @user3956566:input &gt;&gt; ws 修复非常简单,但它会阻止输入实际上是空行(或具有前导空格)。您可以在之前的&gt;&gt; 之后使用ignore(max, '\n') 将缓冲区留空,然后当达到这一点时,即使它是空白的,您也可以读取整行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2018-09-18
  • 1970-01-01
  • 2013-12-15
  • 2012-12-30
相关资源
最近更新 更多