一个C++primer书中的异常,

一个C++primer书中的错误,求助!!!!!!
PS:想了老久,网上也查了很多资料,没找到答案
int ival; 
while (cin>>ival,!cin.eof()) { 
if (cin.bad()) 
throw runtime_error("IO stream corrupted");
if (cin.fail()) {
cerr<<"oh!!"<<endl; 
cin.clear(istream::failbit);
//while ((getchar())!='\n') {
// continue;
// }
continue;
}

}
这是C++primer P248章的一个程序,会造成死循环;我知道原因是键入的错误输出会暂留在缓冲区,然后cin一直读取不了,那我在后面加了上面的注释部分,OK,程序能正常运行,但是oh!第一次会打印两次,而且ctrl+Z退出不了程序,然后我把cin.clear(istream::failbit)换成cin.clear(),程序就完全正常了。
三个问题:1 为什么cin.eof()不能在调试的时候查看其值却可以用cout<<cin.eof()<<endl;输出
2 加上注释掉的那段代码后,程序为什么第一次非整型输入会输出两次,而且ctrl+Z不能退出程序
3 换成cin.clear()程序就能正常运行了,为什么?
百度贴吧也提问了,百度知道也提问了,现在来CSDN 求大牛们帮帮小白吧T.T

------解决方案--------------------
去看《标准C++输入输出流与本地化》
c++ primer上关于流的部分是错误挺多的。
------解决方案--------------------
不是说过了吗,那是c++primer的错误,自己看clear是干嘛的。