关于清空缓冲区,该怎么处理
关于清空缓冲区
#include<iostream>
#include<vector>
#include<stdexcept>
using namespace std;
void keep_window_open()
{
cin.clear();
cout<<flush; //这句不知道用的对不对
cout << "Please enter a character to exit\n";
char ch;
cin >> ch;
cout <<ch <<endl;
return;
}
int main()
try{
vector<int> v;
int x;
while(cin>>x)
{
v.push_back(x);
}
for(int i=0;i<=v.size();i++)
cout<<"v["<<i<<"]=="<<v.at(i)<<endl;
}catch(runtime_error &e){
cout<< e.what()<<endl;
}catch (exception& oor) {
cerr << "Out of Range error: " << oor.what() << endl;
keep_window_open();
return 1;
}catch(...){
cerr<<"exception :something went wrong\n";
return 2;
}
这个程序是我写来练习的,没什么具体目的。
但是当运行keep_window_open();时,为什么会出现一下情况呢?
city@ubuntu:~/Desktop/temp$ ./hh
11
11
f
v[0]==11
v[1]==11
Out of Range error: vector::_M_range_check
Please enter a character to exit
f
我添加cout<<flush;其实是想将最后输入的字符f 给冲掉,但是实际的结果却是没有冲掉,而是赋值给了 char ch。
不知道如果想清空输入缓冲区应该用什么函数呢?而且cout<<flush不是清空缓冲区么?
求教!!!
------解决方案--------------------
C++的不太清楚了,C语言的用法是fflush(stdin),fflush(stdout),fflush(stderr),分别刷新标准输入,输出和错误
------解决方案--------------------
cout.flush();
------解决方案--------------------
首先 cout<<flush 是用来防止程序出错时 数据放在缓冲区没有输入 而进行的手动刷新缓冲区
如果你需要刷新所有的输出 最好使用unitbuf 这个操纵 符在每次执行完写操作后都刷新流 :
cout<<unitbuf <<"a"<<"b";与cout<<"a"<<flush<<"b"<<flush;等价,
nounitbuf则可以使流恢复原样 即系统管理缓冲区刷新
其实在这一点上primer《标准IO库》这一章,讲的挺清楚的
如果 还不清楚 可以去搜一些文章来看一下 建议这篇文章《C++编程对缓冲区的理解》
------解决方案--------------------
应该是flush(cout);返回值为cout吧,不过你那种表现用重载也可以实现
实现1:
#include<iostream>
#include<vector>
#include<stdexcept>
using namespace std;
void keep_window_open()
{
cin.clear();
cout<<flush; //这句不知道用的对不对
cout << "Please enter a character to exit\n";
char ch;
cin >> ch;
cout <<ch <<endl;
return;
}
int main()
try{
vector<int> v;
int x;
while(cin>>x)
{
v.push_back(x);
}
for(int i=0;i<=v.size();i++)
cout<<"v["<<i<<"]=="<<v.at(i)<<endl;
}catch(runtime_error &e){
cout<< e.what()<<endl;
}catch (exception& oor) {
cerr << "Out of Range error: " << oor.what() << endl;
keep_window_open();
return 1;
}catch(...){
cerr<<"exception :something went wrong\n";
return 2;
}
这个程序是我写来练习的,没什么具体目的。
但是当运行keep_window_open();时,为什么会出现一下情况呢?
city@ubuntu:~/Desktop/temp$ ./hh
11
11
f
v[0]==11
v[1]==11
Out of Range error: vector::_M_range_check
Please enter a character to exit
f
我添加cout<<flush;其实是想将最后输入的字符f 给冲掉,但是实际的结果却是没有冲掉,而是赋值给了 char ch。
不知道如果想清空输入缓冲区应该用什么函数呢?而且cout<<flush不是清空缓冲区么?
求教!!!
------解决方案--------------------
C++的不太清楚了,C语言的用法是fflush(stdin),fflush(stdout),fflush(stderr),分别刷新标准输入,输出和错误
------解决方案--------------------
cout.flush();
------解决方案--------------------
首先 cout<<flush 是用来防止程序出错时 数据放在缓冲区没有输入 而进行的手动刷新缓冲区
如果你需要刷新所有的输出 最好使用unitbuf 这个操纵 符在每次执行完写操作后都刷新流 :
cout<<unitbuf <<"a"<<"b";与cout<<"a"<<flush<<"b"<<flush;等价,
nounitbuf则可以使流恢复原样 即系统管理缓冲区刷新
其实在这一点上primer《标准IO库》这一章,讲的挺清楚的
如果 还不清楚 可以去搜一些文章来看一下 建议这篇文章《C++编程对缓冲区的理解》
------解决方案--------------------
应该是flush(cout);返回值为cout吧,不过你那种表现用重载也可以实现
实现1:
- C/C++ code
template<typename Function> ostream& operator<<(ostream& ofile,Function f){ return f(ofile); }