关于输入流failbit

return归来 doctor  2017-12-07 05:42:15
我的目的是,每当输入 {“name”,number} 这样的组时,就显示出来,当输入的形式不对时,就结束程序,以下是我的代码


#include <vector>
using namespace std;

struct Entry
{
string name;
int number;
};

ostream& operator<<(ostream& out, Entry a)
{
out << a.name << " " << a.number << endl;
return out;
}

istream& operator>>(istream& in, Entry& a)
{
char c, c2;
if (in >> c && c == '{'&& in >> c2 && c2 == '"')
{
string name;
while (in.get(c) && c != '"')
name += c;
if (in >> c && c == ',')
{
int number = 0;
if (in >> number>>c && c == '}')
{
a = { name,number };
return in;
}
}
}
in.setf(ios_base::failbit); //输入格式不对,将输入流置为failbit
return in;
}

int main()
{
Entry a;
while (cin>>a) //读入Entry对象,故意输错也无法跳出循环
{
cout <<a << endl;
}

system("pause");
return 0;
}

但是在执行的时候,如果输错格式,程序不会停止,而是会不断输出上一次的输入,如下图


总是无法将cin.failbit置位,无法跳出循环
希望高手帮助,多谢!
...全文
112 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xskxzr 2017-12-07
用setstate而不是setf。 编译器应该报错才对……你该升级编译器了。
  • 打赏
  • 举报
回复
paschen 版主 2017-12-07
输入完后判断if (cin),如果返回0,表示错误,此时要么退出程序,如果需要再接收输入,你需要先清除错误状态
  • 打赏
  • 举报
回复
自信男孩 2017-12-07

cin>>a.name;
cin>>a.number;
cout <<a.name<<a.number << endl;
建议分开输入
  • 打赏
  • 举报
回复
return归来 2017-12-07
引用 1 楼 zhao4zhong1 的回复:
cin.clear();
cin.sync();
是在main程序的while循环中加入么 while (cin>>a) { cout <<a << endl; cin.clear(); cin.sync(); } 还是不行啊
  • 打赏
  • 举报
回复
赵4老师 2017-12-07
cin.clear();
cin.sync();
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2017-12-07 05:42
社区公告
暂无公告