cin.sync()的功能是清空缓冲区,而cin.ignore()虽然也是删除缓冲区中数据的作用,但其对缓冲区中的删除数据控制的较精确,cin.sync()并不是在所有的编译器中都可以被使用
有时候你只想取缓冲区的一部分,而舍弃另一部分,这是就可以使用cin.ignore(),其使用方法是:
cin.ignore(int intExp, char chExp);
其中intExp 是一个整型表达式,也可以是一个整型数值,这个数值表示在一行中忽略的字符的最大数目,比如说intExp=100;还有一个参数chExp,是一个字符表达式。表示如果遇到一个字符值等于chEXP,那么就停止ignore(),如果ignore100个字符之后还没遇到值等于chEXP的字符,那也得停止ignore(),所以100是ignore()所忽略的最大字符数。
下面是几个例子
#include
#include
int main()
{
int ival1 = 0, ival2 = 0;
std::cin >> ival1;
std::cin.ignore(100, ‘\n’);
std::cin >> ival2;
std::cout << "ival1 = " << ival1 << std::endl;
std::cout << "ival2 = " << ival2 << std::endl;
system(“pause”);
return 0;
}
输入
12 34 23
25
输出 12 25
该ignore(100, ‘\n’)为ignore(2, ‘\n’)
输入
12 34 23
输出
12 4
这个是因为我们所用的IO对象cin cout 都是操纵char数据的,不管我们输入的是什么数据,cin cout 都会转成 char来处理,例如我们想要输出的是一个整形变量的值,那么在输出前,cout会将该变量的值转成字符,在进行输出。
如果cin.ignore()不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉。
#include
#include
#include
int main()
{
int num = 0;
std::vector ivec;
do {
std::cout << “please input some numbers:” << std::endl;
while (std::cin >> num)//一直检测输入流状态知道遇到文件结束符(ctrl+z)或错误输入
ivec.push_back(num);
if (ivec.size() == 0)
std::cout << “Error!” << std::endl;
} while (ivec.size() == 0);
system(“pause”);
return 0;
}
这个例子在输入错误时候会陷入死循环
首先需要了解cin的用法。
输入结束条件 :遇到Enter、Space、Tab键
对结束符的处理 :当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。
C++输入缓冲机制规定当用户键入输入之后按下Enter键,便会将所有刚刚用户输入的一次性全送到缓冲区,而cin便会从输入缓冲区中读取数据。回车标志一次输入的完成,如果数据不够,则会等待用户继续输入;如果数据有多余,则将多余的数据存储在输入流缓冲区中,供下次使用。
当缓冲区中有残留数据时,cin会直接去读取缓冲区的数据而不会请求键盘输入。重要的是,回车符也会被存在输入缓冲区中
cin读取到文件结束符(Ctrl+z),cin的状态被置位,不再接收输入
用来更改cin的状态标示符的,cin在接收到错误的输入的时候,会设置状态位good。如果goodbit位不为0,则cin不接受输入。如果下次输入前状态位没有改变那么即使清除了缓冲区数据流也无法输入。所以当输入流发生错误后,要想再次进行输入,必须添加std::cin.clear()。
输入时键入的Enter也会被存储在缓冲区中。
Enter有时候会被读成连续的空格,有时候会被读成结束符,这个由cin自己判断决定。