输入到文件结束应该是所有大学计算机刚学c语言时写oj一定会碰到的,那时候几乎会把以下几句死记硬背下来
while(~scanf("%d",&a))
while(scanf("%d",&a)!=EOF)
while(cin>>a)
其中c++ 的这句while(cin>>a)
到底是什么含义呢。
直观上看就是到文件结束就返回一个0,否则非0.
实际上cin是C++输入流的一个对象,而输入流是否运行正常,其本身是有一个状态的。为了表现这种状态,每个输入流对象都会有一个rdstate()
函数,这个函数会返回一个常量,其二进制的每一个位用于表示输入流一些特定的状态是否出现了,其中输入到文件结束就是其中之一的eof()
状态,如果这个状态出现,rdstate()
返回的函数的响应位就会被置位1,然后该输入流的另一个函数fail()就会返回true。所以while(cin>>a)
其实可以写成while(cin>>a,!cin.fail())
。
因此从以上我们还可以联想到一个问题,既然输入到文件结束后,输入流处于一个不正常状态,那么他之后还能使用吗?
#include<iostream>
using namespace std;
int main()
{
int a;
while(cin>>a);
int b;
cin>>b;
cout<<b<<endl;
system("pause");
}
在使用这个代码时我们发现我们如果对
a
a
a输入^Z,退出循环后,并不能正常地输入b,也就是cin的状态没有恢复。
这时候就要用到一个输入流的另一个函数,clear()
,表示将其状态位全部归0,也就恢复了正常状态。
#include<iostream>
using namespace std;
int main()
{
int a;
while(cin>>a);
int b;
cin.clear();
cin>>b;//这时候b可以正常输入了
cout<<b<<endl;
system("pause");
}
关于C++ io库中的其它操作,后续会补上。