iostream clear() 和 iostate 和ignore

1.以下程序:

#include<iostream>

int main()

{

int i;

std::cin>>i;

std::cin.clear(std::istream::failbit|std::istream::eofbit);

std::cin.ignore(200,'\n');

std::cin>>i;

return 0;

}

为什么这个程序会失败呢?都怪这个clear的名字起的不好.从以上程序,我的原本意图是把failbit和eofbit给clear掉.但是.这个语句的意思是.先调用std::cin.clear().然后再把failbit和eofbit设置为true..那就与原意正好相反了.但是奇怪的是除了百度知道上有人回答这个奇怪的事情以外,其他地方没有看到讲解.

包括,有的书上都写错了.不是不小心,甚至连作者都没有理解.比如说C++PRIMER习题解答P99页习题8.3 .上面竟然还说"笔者所使用的编译器不能正确支持in.clear(istream::failbit);语句" 这就是理解问题了.我觉得肯定有人和我有一样的问题,所以就把这个写上来.


2.ignore

ignore在C++PRIMER里没有详细讲,但是习题里面要用到(没素质..).因为看C++PRIMER里没详细说明,因此让我处理得很麻烦.因为自己也是菜鸟,只能解释一下可以看到的现象,不能解释本质了

std::cin.ignore(200,'\n);

std::cin>>str;

上面的ignore对下面的输入还是有效果的.但只作用一次.这样输入的话,第一次输入是被跳过的.还会输第二次.对于这个我是如此理解的.cin就像是一个水壶.我们键盘输入的内容就是往水壶里面灌水.只要灌进去,它就往外倒.如果发现倒不进去.例如给int型输入一个字符,那么就会保留.在倒出所有的水("除了空格换行符")之前,是不给你键盘输入的机会的.比如说如下程序:

#include<iostream>
#include<string>
using namespace std;
int main()
{
  string str;
  int i;
  cin>>i;
  cin.clear();
  cin>>str;
  cout<<i<<endl
      <<str<<endl;
  return 0;
}

如果第一个输入w,就算是水没倒出去,那么调用clear函数后,不用输入,会把上次灌的水倒入str里面.那么str的值就是你第一次试图赋给int的值.好了,现在就可以合理的解释一下了

std::cin.ignore(200,'\n');

std::cin>>str;

如果我输入:abcdefg\n

那么是没用的因为你打出回车的时候,就相当于打了一个换行符.再遇到换行符所有的东西通通扔掉.但是cin的默认设置应该是忽略换行符,也就是说abcdefg都被扔掉了.\n又不会被输入进去,因此在你再次输入之前,cin里面存的就是\n.

你已经输入过\n,那太好了!做个形象的比喻,如果ignore是个封印,阻止你输入一些东西,那么\n就是解除封印.于是,你的第二次输入就有效了

最后我再强调一下.如果你具有高智商,受不了我冗长的解释,也不要骂我...这与其说是给别人看,不如说给未来的我解释.建议能利用到我这篇文章信息的人,不要完全相信我的话,应该努力看一些高阶的书,然后真正地学会运用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值