1.
首先cin>>a返回的是左操作数,也就是返回cin。
cin的条件状态中: cin.eof() 判断流是否到达文件的结束符
cin.fail() 判断IO操作是否失败
在while(cin>>a)中看流是否还能用,主要是判断 cin.fail() 的取值。事实上,无论是否用于while循环,流必须处于无错误状态才能用于输入和输出 ,也就是cin.fail() 必须为0值,程序以下的cin操作才能正常执行。
导致cin.fail() 为1的操作有:输入坏值 或 遇到文件结束符(ctrl+z)
当cin.fail() =1时,可以设置cin.clear()将流中的所有状态值设为有效状态,以下操作就会正常输入输出了,否则再遇到cin就不能正常读入赋值。
2.
关于while(cin>>a)中输入值是用 “空格” 间隔还是用 “回车” 间隔的问题:
while(cin)中有个缓冲机制规定,只有收到回车键,才会将所有输入的数据一次提交到输入处理函数cin里,而这个输入过程,在按下回车之前,是不受cin控制的。
对于正常的输入,用回车和空格没有差别,关键是我们最后往往要输入个ctrl+z来结束输入,这里要特别注意,ctrl+z之前必须要按“回车”,不能是空格,也不能什么都不按。
正确的顺序是:“正常值输入(以空格或回车间隔都可以)”、“回车”、(ctrl+z)、“回车”。这样在缓冲机制下while(cin)循环就会把ctrl+z作为输入流单独进行判断,cin.eof()为真,即遇到正常的文件结束符,否则,while(cin)循环判断时以为ctrl+z和之前的空格是一起的或者和之前的其他输入是一起的,认为是输入了坏值,认为没有遇到正常的文件结束符。
这样理解对吗,欢迎批评指正!