控制台签到程序[c语言]

 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、判断日期差

        程序存在这几种情况

  1. 第一次打开文件,需要判断文件是否存在,如果不存在,就创建文件,并且写入时间
  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

 

 

 

你可能感兴趣的:(控制台签到程序[c语言])