C++ 关于输入到文件结束

输入到文件结束应该是所有大学计算机刚学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库中的其它操作,后续会补上。

上一篇:教你用PS快速绘制漂亮的兰蔻香水瓶子


下一篇:Photoshop将树林婚片打造出柔和温馨的秋季暖色调