#include<iostream> #include<fstream> #define MAXSIZE 1000 using namespace std; int main() { int a[MAXSIZE]; ifstream fin("input.txt"); if( !fin.is_open() ) { cout<<"open file error"<<endl; return 0; } int num,n=0; while( !fin.eof() ) { fin>>num; if(fin.good()) { a[n++] = num; } } }
【问题】
使用以上代码,最后会多输入一个数。循环明明是通过判断,eof,是否是文件尾来终止的,可是却会多长一个数字。在网上搜了相关的问题。原因大概是这样的:
这是由于C++输入输出流判断末尾的方式不一样,根据是:当 fin>>num 不能再读入数据时,才能发现到了文件结尾,这是才会给输入文件流设置文件结尾标志,即eofbit标志,参会返回true。若此时 num 是文件中的最后一个数字,那么在读入该数字之后,eofbit 是不会马上被设置的,因为此时可以正常输入最后一个数字,fin流会认为文件还没有到末尾,所以while循环中 fin.eof() 为false,还要执行一次,这是数据已被读完,所以继续进行fin>>num,则会多出一个数字,这有可能是最末尾一个数字重复出现,也可能是其它奇怪的数字,这个时候fin才能发现文件到达末尾,进而设置 eofbit 标志,跳出循环,但是在此之前已经多读入一个多余的数字了。
简单来说,就是 fin 在读入最后一个数字的时候,eof() 还是为 FALSE,只有当最后一个数字读入以后,再次使用fin输入,才能发现到达文件末尾,eof() 才为true。
【解决方案】
(1)
int num,n=0;
while( !fin.eof() )
{
fin>>num;
if(fin.good())
{
a[n++] = num;
}
}
(2)
int num,n=0;
while( !fin.eof() )
{
fin>>num;
if(fin.fail())
{
a[n++] = num;
}
}
(3)
peek 函数只适用于字符,也就是char类型,对于str类型,和int类型,我试过都不行,还是会对出一个。
char c;
while(fin.peek()!=EOF)
{
fin >> c;
cout << c ;
}