C++:请教一个关于输入EOF结束循环的问题。

#include <iostream>
#define N 1000
using namespace std;
int daysOfMonth(int y,int m);
int daysOfYear(int y);
int tdays(int year,int month,int day);
bool isLeapYear(int n);
typedef struct Time{
    int year;
    int month;
    int day;    
    int total;
}Time;
int main()
{
    Time time[2];
    while(!cin.eof())
    {
        cin>>time[0].year>>time[0].month>>time[0].day;
        cin>>time[1].year>>time[1].month>>time[1].day;
        time[0].total=tdays(time[0].year,time[0].month,time[0].day);
        time[1].total=tdays(time[1].year,time[1].month,time[1].day);
        cout<<time[0].total-time[1].total<<endl; 
    }
}
int tdays(int year,int month,int day)
{
    int y,m,sum=0;
    for (y=N;y<year;y++)
        sum+=daysOfYear(y);
    for (m=1;m<month;m++)
        sum+=daysOfMonth(year,m);
    sum+=day-1;
    return sum;
}
int daysOfMonth(int y,int m)
{
    if (m==1||m==3||m==5||m==7||m==8||m==10||m==12)
        return 31;
    else if(m==4||m==6||m==9||m==11)
        return 30;
    else if(m==2)
    {
        if (isLeapYear(y))
            return 29;
        else
            return 28;
    }
}
int daysOfYear(int y)
{
    if (isLeapYear(y))
        return 366;
    else
        return 365;
}
bool isLeapYear(int n)
{
    if (n%400==0||n%4==0&&n%100!=0)
        return true;
    else
        return false;
}

 

以上是完整程序。

测试数据:1984 7 1 1980 9 10
1990 2 5 2016 1 28

输出结果:

为何在输入了Ctrl+Z之后仍然会有一行输出?

1. 简单点说,就是cin.eof()不会阻塞等你输入(可以理解为缓冲区中不是EOF就返回false),可以通过以下代码验证。

//不等你输入Ctrl+z,直输出两行0
int main()
{
    cout<<cin.eof()<<endl;
    cout<<cin.eof()<<endl;
    system("pause");
    
}

 2. 所以在cin.eof()之前,需要先调用一次读取操作。

//输入Ctrl+z,输出两行1
int main()
{
    int year;
    cin>>year;
    cout<<cin.eof()<<endl;
    cout<<cin.eof()<<endl;
    system("pause");
}

3. 结合问题,可以先执行cin>>time[0].year,再进行cin.eof()判断,不过cin>>time[0].year表达式会返回读取的内容,如果是EOF,返回的就是false(-1),就不需要加cin.eof()判断了。

while(cin>>time[0].year)
    {
        cin>>time[0].month>>time[0].day;
        cin>>time[1].year>>time[1].month>>time[1].day;
        time[0].total=tdays(time[0].year,time[0].month,time[0].day);
        time[1].total=tdays(time[1].year,time[1].month,time[1].day);
        cout<<time[0].total-time[1].total<<endl; 
    }

详情请参考这个https://blog.csdn.net/gyysmall/article/details/8180514