有时候编程序,会莫名其妙的得不到正确的输出结果,因为没有正确的考虑流的细节;
1.要注意输入与接受变量的类型要匹配,例如给int类型输入3.14,只能接受到3而已;
2.更正:在控制台程序中,屏幕上的输入都会加入到输入流(键盘缓冲区)中,包括最后按下的“Enter”键,如若不加处理,都可能作为下一个字符被cin接受;
3.处理输入流缓冲区的函数有:
(1)cin.clear(); 用来更改cin的状态标示符的 例如输入与接受变量不匹配时,cin会出错,cin的标志位failbit变为1(表示出错),使用cin.clear();就能将Failbit改回0,从而使得cin继续可以使用。常常后接
cin.clear();
while(cin.get()!='\n') continue 使用来吸收缓冲区导致出错的字符流。
参考http://zhidao.baidu.com/link?url=FRVQWb90Ojum9jlywFD47gMKJKFkRtaGTnpOq1eKqUH_w8M5bzAHPALXdVSiuqHoWE9SZeghUqGkQB3en6DGKq
(2)cin.sync();用来清除、刷新缓冲区数据流的未读数据。
(3)cin.ignor();cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。
(从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。
它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。
比如可以这么用:
)(4)cin.sync()和cin.ignor()的比较
sync()的作用就是清除输入缓冲区。成功时返回0,失败时badbit会置位,函数返回-1.
另外,对于绑定了输出的输入流,调用sync(),还会刷新输出缓冲区。
但由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候最好不要用sync()。可以考虑用ignore函数代替。
cin.ignore(numeric_limits<std::streamsize>::max(),'/n');//清除当前行
cin.ignore(numeric_limits<std::streamsize>::max()); //清除cin里所有内容
不要被长长的名字吓倒,numeric_limits<std::streamsize>::max()不过是climits头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。
使用ignore显然能比sync()更精确控制缓冲区。
参考:http://blog.sina.com.cn/s/blog_8d3652760100wl9r.html
4.cin.ignore()与cin.getline()
cin.getline(字符指针(char*),字符个数N(int),结束符(char));
此函数会一次读取多个字符(包括空白字符)。它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字符,直到读满N-1个,或者遇到指定的结束符为止。若不指定结束符,则默认结束符为'\n'。
5.cin.get()与cin.peek()
cin.get()获取一个字符,输入流减少
cin.peek() 只是从流中读取一个字符检查,并不会从流中将该字符去除,即不改变输入流;
eg: while(cin.peek() != '\n') //判断输入流(只提出作检查不会影响全部输出),不为回车键时输出
{
char p =cin.get();
cout <<p;
}
6.cin.gcount()与cin.read()
cin.read()用来控制读入多少个字符 eg. cin.read(buf,20); 只从流中获得20个元素,付给buf中