用C++输出两个指定时间段内所有的日期,并保存为txt

例如输入1960010119700101然后枚举这两个时间的所有日期,输出txt文档用C++怎么写?... 例如
输入
19600101 19700101
然后枚举这两个时间的所有日期,输出txt文档
用C++怎么写?
展开
 我来答
匿名用户
2016-10-23
展开全部
/*程序如果正常结束,桌面上会有一个《测试.txt》文件,可打开检查输入情况*/
#include <iostream>
#include <fstream>

struct date
{
    int year; //年; 
    int month;  //月; 
    int day;   //日; 
};

void ymd(date &x, const unsigned long long &begin);
bool judge(date &x);
void nextday(date &x);

int main()
{
    unsigned long long begin{};
    unsigned long long end{};    
    std::cout << "请输入开始日期和结束日期(空格隔开):"; 
    
    while(std::cin >> begin >> end) //检查; 
    {
        if(begin > end)
            std::cout << "开始日期大于结束日期,请重新输入:";
        else
            break; 
    }
    
    date start{};        
    date over{}; 
    ymd(start, begin);
    ymd(over, end);
    
    if(!judge(start) || !judge(over))  //判断日期正确性; 
    {
        std::cout << "不存在该日期,程序结束!\n";
        exit(1); 
    }
    
    std::ofstream file("C:\\Users\\Administrator\\Desktop\\测试.txt"); //放到了桌面上,程序正常结束后,请打开检查; 
    
    if(!file.is_open())  //检查文件是否打开; 
    {
        std::cout << "文件打开失败,程序结束!\n";
        exit(1); 
    }
    
    file << begin << '\n';
    
    while(!(start.year == over.year && start.month == over.month && start.day == over.day)) //循环到结束日期; 
    {
        nextday(start);
        file << start.year;
        
        if(start.month < 10)
            file << '0' << start.month;
        else
            file << start.month;
            
        if(start.day < 10)
            file << '0' << start.day << '\n';
        else
            file << start.day << '\n';
    }
    
    file << end << '\n';
    file.close();
    return 0;
}

void ymd(date &x, const unsigned long long &begin)  //将输入日期对应赋值到结构成员; 
{
    x.year = begin / 10000;
    x.month = (begin - x.year * 10000) / 100;
    x.day = (begin - x.year * 10000 - x.month * 100);
}

bool judge(date &x) //判断日期是否存在; 
{
    bool temp{true};
    
    if(x.month > 12)
        temp = false;
        
    else if(x.month == 1 || x.month == 3 || x.month == 5 || x.month == 7 || x.month == 8 || x.month == 10 || x.month == 12)
    {
        if(x.day > 31)
            temp = false;         
    }
    
    else if(x.month == 2)
    {
        if(((x.year % 4 == 0 && x.year % 100 != 0)||(x.year % 400 == 0)) && x.day > 29)
            temp = false;
            
        else if(x.day > 28)
            temp = false;        
    }
    
    else
    {
        if(x.day > 30)
            temp = false;
    }
    
    return temp;
}

void nextday(date &x)  //计算下一天的日期; 
{
    if(x.month == 1 || x.month == 3 || x.month == 5 || x.month == 7 || x.month == 8 || x.month == 10 || x.month == 12)
    {
        if(x.day == 31)
        {
            x.day = 1;
            ++x.month;
        }
        
        else
            ++x.day;
    }
    
    else if(x.month == 2)
    {
        if(x.day == 28)
        {
            if((x.year % 4 == 0 && x.year % 100 != 0)||(x.year % 400 == 0))
                ++x.day;
                
            else
            {
                x.day = 1;
                x.month = 3;
            }
        }
        
        else if(x.day == 29)
        {
            x.day = 1;
            x.month = 3;
        }
        
        else
            ++x.day;
    }
    
    else
    {
        if(x.day == 30)
        {
            x.day = 1;
            ++x.month;
        }
        
        else
            ++x.day;
    }
    
    if(x.month > 12)
    {
        x.month = 1;
        ++x.year;
    }
}
百度网友2018359
2016-10-23 · TA获得超过3494个赞
知道大有可为答主
回答量:3486
采纳率:73%
帮助的人:1406万
展开全部
#include <iostream>
#include <string.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
using namespace std;
int is_leapyear(int year)   //如果润年,返回1,否则返回0 
{
if((year&4==0 && year%100!=0) || year%400==0)
{
return 1;
}
else
{
return 0;
}
}

int days_one_month(int year, int month)   //返回一个月的天数 
{
int leap,re=0;
leap=is_leapyear(year);    //是否是润年
switch(month)
{
case 1:     //1,3,5,7,8,10,12月每月都是31天
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
re=31;
break;
case 4:      //4,6,9,11月每月都是30天
case 6:
case 9:
case 11:
re=30;
break;
case 2:
if(leap==1)  //2月判断是否是润年
{
re=29;  //是润年,则是29天
}
else
{
re=28;  //不是润年,则是28天
}
break;
default:
printf("\nmonth is error!");
break;
}
return re;
}

int main(int argc, char** argv) 
{
char date1[10]={"\0"};
char date2[10]={"\0"};
int y1,y2,m1,m2,d1,d2;
cout<<"input first date(ex: 19601001): "<<endl;
cin>>date1;
cout<<"input second date(ex: 19801001): "<<endl;
cin>>date2;
char s[10]={"\0"};  //以下分别把输入的数据转换为数值的
memset(s,'\0',10);  //年,月,日,分别存储于y1,m1,d1中
strncpy(s,date1,4);
y1=atoi(s);
memset(s,'\0',10);
s[0]=date1[4];
s[1]=date1[5];
m1=atoi(s);
memset(s,'\0',10);
s[0]=date1[6];
s[1]=date1[7];
d1=atoi(s);
memset(s,'\0',10);
strncpy(s,date2,4);
y2=atoi(s);
memset(s,'\0',10);
s[0]=date2[4];
s[1]=date2[5];
m2=atoi(s);
memset(s,'\0',10);
s[0]=date2[6];
s[1]=date2[7];
d2=atoi(s);

ofstream ofile;
ofile.open("d:\\www.txt);        //打开文件以便写入
while(1)
{
int n=0;
n=days_one_month(y1,m1); //n为该月有多少天
if(d1>n)                 //d1如果大于n天
{                        //则月份加1
m1++;
d1=1;
}
if(m1>12)                 //月份大于12,则年份加1
{
y1++;
m1=1;
}
memset(s,'\0',10);
sprintf(s,"%d%02d%02d",y1,m1,d1);
ofile<<s<<endl;
d1++;
if(y1>=y2 && m1>=m2 && d1>=d2)
{
break;
}
}
ofile.close();
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2016-10-23
展开全部
就是日期加1天, 注意判断大月、小月、闰年
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沉默丶SHA
2016-10-22
知道答主
回答量:2
采纳率:0%
帮助的人:2074
展开全部
ctrl+c复制ctrl+v粘贴
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式