关于判断输入结束

来源:互联网 发布:js怎么截取字符串 编辑:程序博客网 时间:2024/05/21 22:55

我们平时在oj上提交题目的时候,输入可以在while后面的小括号里处理,由于c++的流会自动判断文件的结尾,操作起来很简单,如下题:

Problem Description
Calculate A + B.

Input
Each line will contain two integers A and B. Process to end of file.

Output
For each case, output A + B in one line.
Sample Input
1 1

Sample Output
2

我们只需要这样写就可以:

#include <iostream>
using namespace std;

int
main()
{

int
a,b;
while
(cin>>a>>b)
         cout<<a+b<<endl;
return
1;
}

但如果我们的输入非常麻烦,不想在while后面的小括号里进行判断呢,那么可以像下面这样写:

#include <iostream>
using namespace
std;

int
main()
{

int
a,b;
while
(1)
{

     cin>>a>>b;
     if
(!cin.good())break;
     cout<<a+b<<endl;
}

return
1;
}

 

我想这种方法需要掌握,有时候会让你很方便。比如有一道题,输入的开始是个3*3的数组,假设数组为a[3][3],并且对于每个a[i][j]我们都需要进行某个判断,那么怎么处理文件尾的问题?

当然我们可以这样

while(cin>>a[0][0])
{
    if(a[0][0]...) {...}
    for(int i=0;i<3;i++)
         for(int j=0;j<3;j++)
       {
             if(i==0&&j==0) continue;
              cin>>a[i][j];
             if(a[i][j]...)
{...}
        }
}

可以是可以,但是可以看到有多麻烦了,而用上面的方法就大大不一样了,高效一些,更重要的是美观太多了,如下:

while(1)
{
    for(int i=0;i<3;i++)
         for(int j=0;j<3;j++)
         {
              cin>>a[i][j];
              if(a[i][j]...) {...}
         }
     if(!cin.good()) break;

}

原理:

以下内容转自CSDN博客 http://blog.csdn.net/candj/archive/2009/08/06/4419585.aspx

需要连续从标准输入读取数据时,可以采用下面两种不同的方式判断文件结束:
int i;  
while(scanf("%d",&i) != EOF){do whatever...}  
while(cin >> i){do whatever...}  

首先看scanf,当成功读取时返回读取的项的数目,如:scanf("%d %d",&i,&j)返回2,scanf("%d %f %s",&i, &f, c)返回3。这个数目可以是你希望读取的项数,也可能小于希望读取的项数,在匹配失败时返回0(如:用scanf("%d",&i)接收整数而输入是英文字母时就返回0)。需要注意的是用while(scanf("%d",&i) != EOF)时,接收到像876652098643267843超过int型取值范围的数时循环也会继续执行;相同的情况出现在while(cin >> i)上时循环会立即结束。

cin >>返回值的类型是basic_istream&,代表cin的地址。在ios.h文件中定义了类型转换函数:


operator void *() const { if(state&(badbit|failbit) ) return 0; return (void *)this; }  

有这个函数定义后,需要时ios类型转换成void*类型。而在读入发生错误时返回0。

在对一个流对象进行I/O操作发生错误时,错误的类型被记录在ios类的一个数据成员中。

ios类中定义的描述错误状态的常量:
       goodbit-------------没有错误,正常状态 
       eofbit---------------到达流的结尾
       failbit---------------I/O操作失败,清除状态字后,可以对流继续进行操作。
       badbit--------------试图进行非法操作,清除状态字后,流可能还可以使用。
       hardfail------------致命错误,不可恢复的错误。
对应于这些位,可用ios中定义的如下函数来检查流的当前状态位:
       int good()---------如果正常,返回非0值
       int bad()-----------如果badbit被设置,返回非0值
       int eof()------------如果eofbit被设置,返回非0值
       int fail()------------如果failbit被设置,返回非0值
       int rdstate()------返回当前错误状态位.