关于输入流failbit

return归来 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置位,无法跳出循环
希望高手帮助,多谢!
...全文
197 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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();

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧