为何a.txt 中的2没有输出出来,或者换句话说while 循环体为什么就执行了1次

为什么a.txt 中的2没有输出出来,或者换句话说while 循环体为什么就执行了1次?

#include<iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream  is;
    //a.txt 中的内容:AAA 2
is.open("a.txt");

int i;
while (is >> i, !is.eof())
{
if (is.fail())
{
cerr << "bad!" << endl;
is.clear();
is.ignore(std::numeric_limits<int>::max());
continue;
}
cout << i << endl;

}
return 0;
}

【问题】:为什么a.txt 中的2没有输出出来,或者换句话说while 循环体为什么就执行了1次?
我认为读入2的时候还没有到文件的eof呀?请高手解释。

------解决方案--------------------
这句 is.ignore(std::numeric_limits<int>::max()); 把流全吃了吧,后面已经没东西了。
------解决方案--------------------
引用:
Quote: 引用:

这句 is.ignore(std::numeric_limits<int>::max()); 把流全吃了吧,后面已经没东西了。

我把文本里内容改为:2
运行结果什么也输不出来了。

就是这个原因,basic_istream::ignore的第二个参数是分隔符,它将略过所有字符直到分隔符为止,分隔符本身也被略过,最多略过参数一所指定的数量。这个分隔符缺省值是eof,而参数1就是极大数,所以直到文件尾的所有数据都被略过了。
改为:

is.ignore(std::numeric_limits<int>::max(), ' ');

这时会输出:
bad!
2

注意a.txt中需要在2后面加上一个空格或新行。
也可以加其它非数字字符,这时就会输出
bad!
2
bad!


改为2之后不输出是因为刚读完第一个数据就到文件尾了,while循环0次,而输出代码在循环体内,自然不会执行。你在2后面哪怕只加一个空格,也会输出一个2。