C++中关于输入流缓冲区问题(cin.clear()和cin.sync())

来源:互联网 发布:已连接的udp端口 编辑:程序博客网 时间:2024/06/06 04:09
//给出两个int型的vector对象,判断一个对象是否是另一个对象的前缀#include<iostream>#include<vector>using namespace std;
int main(){ vector<int> ivec1, ivec2; int ival;
 //读入第一个vector对象的元素 cout << "Enter elements for the first vector:(32767 to end)" <<endl; cin >> ival; while (ival != 32767) {  ivec1.push_back(ival);  cin >> ival; }
 //读入第二个vector对象的元素 cout << "Enter elements for the second vector:(32767 to end)" <<endl; cin >> ival; while (ival != 32767) {  ivec2.push_back(ival);  cin >> ival; }
 //比较两个vector对象 vector<int>::size_type size1, size2; size1 = ivec1.size(); size2 = ivec2.size(); bool result = true; for (vector<int>::size_type ix = 0;  ix != (size1 > size2 ? size2 : size1); ++ix)  if (ivec1[ix] != ivec2[ix]) {   result = false;   break;  }
  //输出结果  if(result)   if (size1 < size2)    cout << "The first vector is prefix of the second one."         <<endl;   else if(size1 == size2)    cout << "Two vectors are equal." << endl;   else     cout << "The second vector is prefix of the first one."         << endl;  else   cout << "No vector is prefix of the other one."<<endl;
  return 0;}
 
 
在程序中,对于输入文本的结束部分,使用的是32767,如果使用Ctrl+Z,有些教材给出的是:使用cin.clear();来清空输入流缓冲区。但是,只有cin.clear()是不够的。cin.clear()是用来更改cin的状态标示符的。修改以下代码:
 //读入第一个vector对象的元素 cout << "Enter elements for the first vector:(32767 to end)" <<endl;
 cin >> ival; while (ival != 32767) {  ivec1.push_back(ival);  cin >> ival; }
//读入第二个vector对象的元素 cout << "Enter elements for the second vector:(32767 to end)" <<endl; cin >> ival; while (ival != 32767) {  ivec2.push_back(ival);  cin >> ival; }
 
修改后为:
 //读入第一个vector对象的元素 cout << "Enter elements for the first vector:(Ctrl+Z to end)" <<endl; while (cin >> ival) {  ivec1.push_back(ival); }
 cin.clear();
 //读入第二个vector对象的元素 cout << "Enter elements for the second vector:(Ctrl+Z to end)" <<endl;  while (cin >> ival) {  ivec2.push_back(ival); }
运行结果如下:
这里并没有进行第二次输入,由于在第一次输入时,有数据遗留在“输入缓冲区”中,故而cin不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却不是需要的int型对象,数据再次被遗留在缓冲中,如此反复,第二个while(cin >> ival)执行完毕。
对于程序的修改,只需在
cin.clear();
下面增加一行代码:
cin.sync();
cin.sync()是用来清除缓存区的数据流的。如果标示符没有改变那么即使清除了数据流也无法输入。所以cin.clear()和cin.sync()要联合起来使用。
 
那么,对于cin.clear()和cin.sync(),参考一下程序:
#include<iostream>using namespace std;
intmain(){ 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;}
 
 
除了联合使用cin.clear()和cin.sync(),还有另一个方法:
//读入第一个vector对象的元素//……
 cin.clear(); if(cin.get() !='\n') { //读入第二个vector对象的元素 //……
 //比较两个vector对象 //……
 //输出结果 //……… } else  return -1;
  return 0;}
 
 
 
 
 
原创粉丝点击