标准输入设备cin是指从键盘输入数据 , 而我们知道从键盘输入的时候是使用了缓冲的(windows中是行缓冲) ,系统将输入数据放到程序的缓存内存中是以Enter键为标志的。
也就是说 我们输入了一行数据(可以只一个字符或者N个字符时)时,这些数据先是被系统检测到后存放在系统的某处(如系统中的内存,但不是程序的内存中), 而只有当我们按下Enter键后,系统才会将输入的这一行数据存放到我们的程序的输入缓存中.
例如:假设我们程序的输入缓存用char buf[MAX_SIZE]数组表示,
那么当我们遇到第一条输入语句cin>>x>>y>>z;(假设为char类型),由于是第一次程序中的第一条输入,故此时的输入缓存还是空的。程序运行到此处时会先检测自已的输入缓存是否为空。如果为空,则会再检测是否遇到结束符EOF (EOF标志并不出现在输入缓存中) 。如果遇到EOF,则输入语句直接返回;如果没有遇到EOF结束标志,则输入操作将阻塞,即程序暂停等待用户输入。
然后我们开始输入数据,但是在我们按下回车符之前,行缓存都一行为空,程序就一直等待。直到我们按下Enter后,
我们输入的数据比如为"abcde"才会被系统存放到程序的输入缓存中。这时候cin>>x>>y>>z;就会发现输入缓存不为空了。然后x,y,z就会分别读入数据了。x='a' ,y ='b', z= 'c'; 注意,此时程序的输入缓存中的数据并没完 即”de" 还在缓存里。
程序继续运行到某处的输入语句cin>>u>>v >>w; (也为char类型) ,然后发现输入缓存中还有数据,则u = 'd' ,v = 'e'; 但将给w赋值的时候发现没数据了,此同就同上了,程序又开始等待 (同上) .
验证程序(c++):
int main()
{
char x,y,z,u,v,w;
cout<<"Please enter the data :";
cin>>x>>y>>z;
cout<<"then x = "< //再次输入u,v,w
cin>>u>>v>>w;
cout<<"u = "<int main()
{
int x = 0;
cout<<"enter a data for int x:";
cin>>x;
cout<
char c = 'p';
cout<<"cin的标志位:"<<(bool)cin< cin>>c;
cout<<"c = "< cin.clear(); //清除cin的错
cout<<"cin的标志位:"<<(bool)cin< cin>>c;
cout<<"c = "<}
- 再来看看while(cin>>x)结束的方式 (x为任意类型)
1.可以用 上面的方法,使cin的标志位置为false.但这种方法得在while后面再用cin前,使用cin.clear()清除错误。 (cin>>x的返回值为cin的引用.相当于cin>>x,while(cin){})
2.可以在输入新的一行时输入^z (键盘上按下 ctrl+z) 回车,这种情况下cin也标志位也会置为false. 注意:^z得出现在输入的每行的第一个才有效!
下面就我个人理解来解释下 ^z:
^z 相当于文件输入流的EOF标志。
从上面可知cin>>x的时候,程序是先检测输入缓存是否为空。若为空,则再检测EOF标志。若无EOF,则程序等待用户输入。注:^z并不会进入到输入缓存中
每按一次回车时候,程序就执行下上面的步骤。
我们可以认为 ^z 符号只在一次回车时有用。即当输入 'abc'^z的时候, 程序执行不到检测EOF时,就已经有输入了(此时这次的^z就已经失效了,因为它的前面有输入了)
故:^z ( ctrl+z)结束时,得在行首输入! 后面要再次使用cin时,得再调用cin.clear();
验证如下:
int main()
{
int c;
while(cin>>c){
cout<<"in while"< cout<<"请在行首按下^z结束(ctrl+z) 或者输入字母结束 "< }
cout<<"cin 的状态:"<<(bool)cin< cin.clear();//然后就可以接着用cin了
}
本文完。如有错误,还请各个高手指正。
转载请注明出处.