cin.clear()。cin.get()

 

#include<iostream>
using namespace std;
int main()
{
 char ch,str[5];
 cin.getline(str,5);
 cout<<"flag1"<<cin.good()<<endl;
 cin.clear();//清除错误标志
  cout<<"flag2"<<cin.good()<<endl;//清除标志后查看状态
 cin>>ch;
 cout<<"str"<<str<<endl;
 cout<<"ch"<<ch<<endl;
 return 0;
}
测试输入:
12345[enter];
输出
flag:0;//good()返回false说明返回异常
flag:2 1;//good()返回true,说明clear()已经清楚了错误标志
 str:1234

#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
int main()
{
 
 fstream inFile,outfile;

 inFile.open("liupanmin.txt");
 if(!inFile.is_open())
 {
  cout<<"cout not open the file"<<endl;
  exit(1);
 }
 double value;
 double sum=0.0,average;
 int count=0;
 inFile>>value;
 while(inFile.good())
 {
  count++;
  sum+=value;
  inFile>>value;

 }
 inFile.close();
 outfile.open("liupanmin.txt",ios::out|ios::app);
 if(!outfile)
 {
  cout<<"cant open "<<endl;
  exit(1);
 }
 average=sum/count;
 cout<<sum<<" "<<average<<endl;
 cout<<"把总分和平均分存入文件"<<endl;
 char line[80],s[180];;
 cin.getline(line,sizeof(line));
 outfile<<line;
 outfile<<sum<<endl;
 cin.clear();
 //或cin.ignore();
 cin.getline(s,sizeof(s));
 outfile<<s;
 outfile<<average;
 outfile.close();
 return 0;
}

#include<iostream.h>
int main()
{
 {
  char c1,c2;
  cin.get(c1);
  cin.ignore();//用该函数的默认情况,丢弃一个字符。自上次输入结束的回车符
  cin.get(c2);
  cout<<c1<<" "<<c2<<endl;
  cout<<(int)c1<<" "<<(int)c2<<endl;//打印这俩个字符的!ASCLL值
  cout<<(int*)c1<<" "<<(int*)c2<<endl;//打印这俩字符的地址

  return 0;
 }
}
 丢弃一个字符
  用cin.get()读取字符,第一次读取时用回车符结束,而get函数不丢弃回车符,我们用ignore函数丢弃一个字符,即回车符

 #include<iostream.h>
const int MAX=5;
int main()
{
 int golf[MAX];
 cout<<"please enter your golf scores.\n";
 cout<<"you must enter "<<MAX<<"rounds.\n";
  int i;
 for(i=0;i<MAX;i++)
 {
  cout<<"round#"<<i+1<<":";
  while(!(cin>>golf[i]))
  {
   cout<<"wrong input"<<endl;

   cin.clear();
   //resrt input;
   while(cin.get()!='\n')
    continue;//get rid of bad input
   cout<<"please enter a number again:"<<endl;
   cout<<"you must enter "<<MAX<<"rounds.\n";

  }
 }
 double total=0.0;
 for(i=0;i<MAX;i++)
  total+=golf[i];

 cout<<total/MAX<<"=average score"<<MAX<<"rounds\n";

  return 0;
}
/*

当用户输入的不是数字时,本程序时让他继续读取得例子,如果用户输入的人非数字,程序将拒绝,并要求用户继续输入数字,程序发现输入错内容时,应采取三个步骤
1.重置cin已接受新的输入。
2:删除错误输入;
3:提示用户重新输入。
当输入错误时,进入 while(!(cin>>golf[i]))循环,该循环的第一条语句使用clear()方法重置输入,如果生罗这条语句程序将拒绝继续都去输入,。接下来程序在while循环中
使用cin.get()来读取行为之前的所有输入,从而删除这一行中错误输入。另一种方法时
if(!cin)
{
cin.clear();
cin.get();
}
cin.get();//read end of line after last input;;
cin.get();
//wait for user to press <enter> */


 

cin.clear()与cin.sync()与cin.ignore()

 

分类: cpp

阅读程序一与程序二:

一:

#include<iostream>
using namespace std;

int main()
{
int a;
cout<<"输入一个字母:"<<endl;
cin>>a; //int型变量中放了char型数据,failbit置1
cout<<"cin.fail()="<<cin.fail()<<endl; //输出1
//cin.clear();
//cin.sync();
cout<<"输入一个数字:"<<endl; //由于failbit值为1,输入流不能正常工作
cin>>a; //故此处的输入无效
cout<<a<<endl; //输出不确定值
cin.clear(); //此处用cin.clear()流标志复位
//cin.sync();
cout<<"cin.fail()="<<cin.fail()<<endl; //此处failbit已为0
cout<<"输入一个数字:"<<endl;
//但刚才输入的字符并没有从流中清除,所以cin>>a又把那个字符放入a中,流输入流又不能正常工作
cin>>a;
cout<<a<<endl; //输出不确定值
cout<<"cin.fail()="<<cin.fail()<<endl; //在此处failbit又为1
cin.clear(); //再次修复输入流
cin.ignore(); //取走刚才流中的字符
cout<<"输入一个数字:"<<endl; //再次接收用记输入,这次输入数字,正常输出了
cin>>a;
cout<<"a="<<a<<endl;
//现在再看一下输入流的failbit
cout<<"cin.fail()="<<cin.fail()<<endl;//输出0,表明输入流已恢复正常
return 0;
}

二:

int main()
{
int a;
while(cin>>a){
cout<<a;
}
cin.clear();//修复输入流(因为上面的回车符也进入了缓冲区)
cin.sync();//清除缓冲区(非法字符‘回车符’)
while(cin>>a){
cout<<"a="<<a<<endl;
}
return 0;
}

感触最深的是cin.clear(),cin.ignore()


   1、cin.getline()
cin.getline()方法连续地从用户终端接受字符,并将字符存入字符型数组message中,直到输入了(maxchars-1)个字符(第maxchars个字符用来存储字符串结尾的NULL字符'\0')或者接受到了回车为止,这终端键入回车键产生一个换行'\n',它被cin.getline()认为是行输入结尾。cin.getline()获得的字符(除了换行符外)被存储到message数组中。在返回之前,cin.getline()函数在存储的这些字符后面添加一个NULL字符'\0'。
2、cin.get()
cin.get(name, ArSize);
cin.get(dessert, Arsize); // a problem
Because the first call leaves the newline in the input queue, that newline is the first character the second call sees. Thus, get() concludes that it's reached the end of line without having found anything to read. Without help, get() just can't get past that newline.
Fortunately, there is help in the form of a variation of get(). The call cin.get() (no arguments) reads the single next character, even if it is a newline, so you can use it to dispose of the newline and prepare for the next line of input. That is, this sequence works:
cin.get(name, ArSize); // read first line
cin.get(); // read newline
cin.get(dessert, Arsize); // read second line
Another way to use get() is to concatenate, or join, the two class member functions as follows:
cin.get(name, ArSize).get(); // concatenate member functions
What makes this possible is that cin.get(name, ArSize) returns the cin object, which then is used as the object that invokes the get() function. Similarly, the statement
cin.getline(name1, ArSize).getline(name2, ArSize);
reads two consecutive input lines into the arrays name1 and name2; it's equivalent to making two separate calls to cin.getline().

3、Cin.ignore()
Cin.ignore()方法cin.ignore(5, 'c')的是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到5或者被抛弃的字符是'c',则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024, '\n');通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。
4、cin.sync()
清空输入缓冲区的内容
在输入规定的数目float型数据中错误输入一个string型,然而后提示输入错误,转重新输入,直到输入正确,可以执行下面的程序

int x;
cin >> x;
while (cin.fail())
{
cin.clear();
cin.sync();
cout << "XXXXX"<<endl;
cin >> x;
}
5、Cin.clear()
Cin.clear()用法如果输入发生错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值,只要将ios::goodbit作为实参。

#include <iostream>
using namespace std;
void main()
{
int a;
cout<<"输入一个字母:"<<endl;
cin>>a; //int型变量中放了char型数据,failbit置1
cout<<"cin.fail()="<<cin.fail()<<endl; //输出1
cout<<"输入一个数字:"<<endl; //由于failbit值为1,输入流不能正常工作
cin>>a; //故此处的输入无效
cout<<a<<endl; //输出不确定值
cin.clear(); //此处用cin.clear()流标志复位
cout<<"cin.fail()="<<cin.fail()<<endl; //此处failbit已为0
cout<<"输入一个数字:"<<endl;
//但刚才输入的字符并没有从流中清除,所以cin>>a又把那个字符放入a中,流输入流又不能正常工作
cin>>a;
cout<<a<<endl; //输出不确定值
cout<<"cin.fail()="<<cin.fail()<<endl; //在此处failbit又为1
cin.clear(); //再次修复输入流
cin.ignore(); //取走刚才流中的字符
cout<<"输入一个数字:"<<endl; //再次接收用记输入,这次输入数字,正常输出了
cin>>a;
cout<<"a="<<a<<endl;
//现在再看一下输入流的failbit
cout<<"cin.fail()="<<cin.fail()<<endl;//输出0,表明输入流已恢复正常
}



6、cin.rdstate()
这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。
goodbit 无错误
Eofbit 已到达文件尾
failbit 非致命的输入/输出错误,可挽回
badbit 致命的输入/输出错误,无法挽回
有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.
  下例示例,表示出了rdstate()的用法:

#include <iostream>
using namespace std;
int main()
{
int a;
cin>>a;
cout<<cin.rdstate()<<endl;
if(cin.rdstate() == ios::goodbit)
{
cout<<"输入数据的类型正确,无错误!"<<endl;
}
if(cin.rdstate() == ios_base::failbit)
{
cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;
}
system("pause");
}


  另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态:
bool bad();
bool eof();
bool fail();
bool good();


  下例示例,表示出了上面各成员函数的用法:

#include <iostream>
using namespace std;
int main()
{
int a;
cin>>a;
cout<<cin.rdstate()<<endl;
if(cin.good())
{
cout<<"输入数据的类型正确,无错误!"<<endl;
}
if(cin.fail())
{
cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;
}
system("pause");
}


  如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。
  示例代码如下:

#include <iostream>
using namespace std;
int main()
{
int a;
cin>>a;
cout<<cin.rdstate()<<endl;
cin.clear(ios::goodbit);
cout<<cin.rdstate()<<endl;
system("pause");
}


通常当我们发现输入有错又需要改正的时候,使用clear()更改标记为正确后,同时也需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。


  示例代码如下:

#include <iostream>
using namespace std;

int main()
{
int a;
while(1) //也可以写成for(;1;)
{
cin>>a;
if(!cin)//条件可改写为cin.fail()
{
cout<<"输入有错!请重新输入"<<endl;
cin.clear();
cin.get();
}
else
{
cout<<a;
break;
}
}
system("pause");
}


  最后再给出一个对文件流错误标记处理的例子,巩固学习,代码如下:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream myfile("c:\\1.txt",ios_base::in,0);
if(myfile.fail())
{
cout<<"文件读取失败或指定文件不存在!"<<endl;
}
else
{
char ch;
while(myfile.get(ch))
{
cout<<ch;
}
if(myfile.eof())
{
cout<<"文件内容已经全部读完"<<endl;
}
while(myfile.get(ch))
{
cout<<ch;
}
}
system("pause");
}


cin.getline()方法连续地从用户终端接受字符,并将字符存入字符型数组message中,直到输入了(maxchars-1)个字符(第maxchars个字符用来存储字符串结尾的NULL字符'\0')或者接受到了回车为止,这终端键入回车键产生一个换行'\n',它被cin.getline()认为是行输入结尾。cin.getline()获得的字符(除了换行符外)被存储到message数组中。在返回之前,cin.getline()函数在存储的这些字符后面添加一个NULL字符'\0'。

Cin.ignore()方法cin.ignore(   5,   'c'   )   的是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到5或者被抛弃的字符是'c',则cin.ignore()   函数执行终止;否则,它继续等待。  它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(   1024,   '\n'   );,通常把第一个参数设置得足够大,这样实际上总是只有第二个参数   '\n'   起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

Cin.clear用法如果输入发生错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参;

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值