IDE:VS 2015
昨晚睡前锻炼,然后想记录每天锻炼天数,所以决定自己写个打卡程序,虽然网上很多现成的打卡APP,但是学习是永无止境的。所以就决定自己编写一个这样的程序。
程序思路:
1、获取系统时间
获取系统时间用的是time()函数,main函数中第一行就用了time_t数据类型,什么是time_t数据类型呢?
我们选中time_t右击->"转到定义" 显示如下:
#ifndef _CRT_NO_TIME_T
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif
我们再选中time64_t右击->"转到定义" 显示如下:
typedef __int64 __time64_t;
是用typydef 关键字来替代系统默认的基本类型名称等。
所以time_t数据类型就是int64
c语言是提供了时间结构的结构体的,所以我们直接声明结构体变量
struct tm *p;
我们选中tm右击->"转到定义" 显示如下:
struct tm
{
int tm_sec; // seconds after the minute - [0, 60] including leap second
int tm_min; // minutes after the hour - [0, 59]
int tm_hour; // hours since midnight - [0, 23]
int tm_mday; // day of the month - [1, 31]
int tm_mon; // months since January - [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday - [0, 6]
int tm_yday; // days since January 1 - [0, 365]
int tm_isdst; // daylight savings time flag
};
可以看到这个结构体中的成员变量,这样的话,我们引用变量的时候心里也有数
我们引用成员变量写入到文件中,这样就获取完成了
2、判断日期差
程序存在这几种情况
判断是否连续签到则是用if语句判断,如果满足条件进行下一次签到,并且覆盖原先的签到时间,下一次签到时读取上一次 签到时间。
代码如下:
// signIn.cpp : 定义控制台应用程序的入口点。
//1、获取系统时间
//2、判断日期差
// 如日期间差大于1天则无法签到次数+1
#include "stdafx.h"
int main()
{
time_t timep;
struct tm *p;
timep = time(&timep);
p = gmtime(&timep);
FILE *fp;
int daysNum = 1;
int year = 0;
int mon = 0;
int day = 0;
int hour = 0;
int min = 0;
int *pyear = &year;
int *pmon = &mon;
int *pday = &day;
int *phour = &hour;
int *pmin = &min;
int *pdaysNum = &daysNum;
fp = fopen("D:\\signIn.txt","r");
if (fp == NULL)
{
year = 1900 + p->tm_year;
mon = 1 + p->tm_mon;
day = p->tm_mday;
hour = 8 + p->tm_hour;
min = p->tm_min;
daysNum += 1;
fp = fopen("D:\\signIn.txt", "wb");
puts("未找到目录下文件,已创建文件");
fwrite(pyear, sizeof(int), 1, fp);//写入年份
fwrite(pmon, sizeof(int), 1, fp);//写入月份
fwrite(pday, sizeof(int), 1, fp);//写入日期
fwrite(phour, sizeof(int), 1, fp);//写入小时
fwrite(pmin, sizeof(int), 1, fp);//写入分钟
fwrite(pdaysNum, sizeof(int), 1, fp);
printf("%d/%d/%d\n%d:%d\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min);
puts("第一次签到");
fclose(fp);
}
else
{
year = 0;
mon = 0;
day = 0;
hour = 0;
min = 0;
fp = fopen("D:\\signIn.txt", "rb");
fread(pyear, sizeof(int), 1, fp);
fread(pmon, sizeof(int), 1, fp);
fread(pday, sizeof(int), 1, fp);
fread(phour, sizeof(int), 1, fp);
fread(pmin, sizeof(int), 1, fp);
fread(pdaysNum, sizeof(int), 1, fp);
fclose(fp);
printf("%d/%d/%d\n%d:%d", year, mon, day, hour, min);
if (year ==(1900+ p->tm_year)&&mon ==(1+ p->tm_mon) && ((day + 1) == p->tm_mday))
{
fp = fopen("D:\\signIn.txt", "wb");
daysNum++;
puts("今日签到时间为:");
printf("%d/%d/%d\n%d:%d\n签到次数:%d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min,daysNum);
year = 1900 + p->tm_year;
mon = 1 + p->tm_mon;
day = p->tm_mday;
hour = 8 + p->tm_hour;
min = p->tm_min;
fwrite(pyear, sizeof(int), 1, fp);//写入年份
fwrite(pmon, sizeof(int), 1, fp);//写入月份
fwrite(pday, sizeof(int), 1, fp);//写入日期
fwrite(phour, sizeof(int), 1, fp);//写入小时
fwrite(pmin, sizeof(int), 1, fp);//写入分钟
fwrite(pdaysNum, sizeof(int), 1, fp);
fclose(fp);
}
else if (((day + 1) < p->tm_mday))
{
puts("您未连续签到");
year = 1900 + p->tm_year;
mon = 1 + p->tm_mon;
day = p->tm_mday;
hour = 8 + p->tm_hour;
min = p->tm_min;
fp = fopen("D:\\signIn.txt", "wb");
puts("重新写入时间");
daysNum = 1;
fwrite(pyear, sizeof(int), 1, fp);//写入年份
fwrite(pmon, sizeof(int), 1, fp);//写入月份
fwrite(pday, sizeof(int), 1, fp);//写入日期
fwrite(phour, sizeof(int), 1, fp);//写入小时
fwrite(pmin, sizeof(int), 1, fp);//写入分钟
fwrite(pdaysNum, sizeof(int), 1, fp);
puts("今日签到时间为:");
printf("%d/%d/%d\n%d:%d\n签到次数:%d\n", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, 1);
fclose(fp);
}
else if (day == p->tm_mday)
{
puts("您已签到");
}
}
/*
printf("%d\n", p->tm_sec); //获取当前秒
printf("%d\n", p->tm_min); //获取当前分
printf("%d\n", 8 + p->tm_hour);//获取当前时,这里获取西方的时间,刚好相差八个小时
printf("%d\n", p->tm_mday);//获取当前月份日数,范围是1-31
printf("%d\n", 1 + p->tm_mon);//获取当前月份,范围是0-11,所以要加1
printf("%d\n", 1900 + p->tm_year);//获取当前年份,从1900开始,所以要加1900
printf("%d\n", p->tm_yday); /从今年1月1日算起至今的天数,范围为0-365
*/
system("pause");
return 0;
其中,用读文件用fread函数,那么写文件最好用fwrite函数,用这两个函数的时候,程序创建的文件中,文件内容是乱码。
因为fwrite函数写到文件中的是二进制数据,用fread读出的话是一样的,如果想在文件中清楚的看到内容的话,可以使用fprintf函数写入。
参考资料:
https://blog.csdn.net/u012229282/article/details/79598287