标准IO练习题

标准IO练习题

题目:

设计程序,获取当前系统时间,把时间转换为特定格式”yy年mm月dd日 星期x tt:mm:ss”,并每隔1s写入到本地磁盘中一个叫做log.txt的文本中,如果文本不存在则创建。

分析:

本题目需要利用time()获取当前系统时间,但由于time()是将获取得到的时间以秒的形式返回,使用起来诸多不便,所以还需要采用localtime()对time()获取数据进行处理。请注意,此时得到的数据并不是正确的系统时间。这是因为localtime()内部定义导致的,所以需要人为的对获取到的数值进行处理。

本题目还需要将获取时间值写入本地磁盘文本中,写入方式有很多。但由于localtime()内部变量均为int类型,所以笔者调用fprintf()函数直接将数据写入到目标文件中。

本题目还要求每隔一秒写入文本中,且文本不存在需要创建。故而fopen的mode不能使用“r+b",且需要调用sleep()配合死循环完成每隔一秒写入文本的要求。

代码展示

/************************************************************************************
*
*	file name:	get_time.c
*	author	 :  790557054@qq.com
*	date	 :  2024/05/09
*	function :  该案例需获取当前系统时间,把时间转换为特定格式”yy年mm月dd日
				星期x tt:mm:ss”,并每隔1s写入到本地磁盘中一个叫做log.txt的文本中,
				如果文本不存在则创建。 
* 	note	 :  该案例需要调用localtime()函数、time()和相关标准IO函数,
				并且对localtime函数获取值进行处理
*
*	CopyRight (c)  2023-2024   790557054@qq.com   All Right Reseverd 
*
* *******************************************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, const char *argv)
{
	while(1)
	{
		//打开log.txt文件,若不存在,则创建该文件
		FILE *fp = fopen("log.txt", "a+b");
		if(fp == NULL)
		{
			printf("log.txt is open fail\n");
			exit(-1);
		}
		//利用time()获取当前系统时间,并将返回值存储起来
		time_t systime = time(NULL);
		//利用localtime()对获取值进行处理,并将处理后的数据写入目标文件中
		struct tm *systimep = localtime(&systime);
		systimep->tm_year += 1900;
		systimep->tm_mon += 1;
		fprintf(fp, "%d 年 %d 月 %d 日 星期%d %d:%d:%d", systimep->tm_year,
				systimep->tm_mon,
				systimep->tm_mday,
				systimep->tm_wday,
				systimep->tm_hour,
				systimep->tm_min,
				systimep->tm_sec);
        //防止写入数据重叠不好看
		fprintf(fp, "\n");
		// 每隔1秒写入一次
		fclose(fp);
		sleep(1);
	}


	return 0;
}

结果展示

image

总结

经过验证,上述代码可以基本完成题目要求。

但是可以对代码进行优化,例如上图中的星期4并不好看,或许可以通过枚举对其进行判断改名;又或是该文本写入后,数据只会从末尾开始写起,当用户需要对文本进行刷新输入的时候,目前程序无法办到。

总而言之,该题目的要求已基本达到,且加深了对于标准IO函数的使用,以及对于time()和localtime()的使用。

知识扩展

time()函数

image

注意:

  • time()是有参数的,但是在使用过程中,一般填为NULL,再设置一个time_t 的变量接受其返回值
  • time()是以秒为单位获取时间,且其返回值也是以秒为单位,其意义为从1970-01-01 00:00:00 到当前系统时间的秒数

localtime()函数

该函数的返回值是一个tm结构体指针变量,且需要传入一个time_t *作为参数。因此,该函数需要与time()一起使用。

image

注意:

  • tm结构体中的变量均为 int 类型,且细分为年月日,时分秒。使用时可以利用结构体指针进行对其调用。
  • tm结构体中的tm_year变量是当前系统时间减去1900后的数据,所以实际使用中需要加上1900得到当前系统时间年数值。
  • tm结构体中的tm_mon变量意为月份,但是其数值范围为0-11与实际中1-12月份不同,所以实际使用中需要手动对其+1.
posted @ 2024-05-09 21:06  飞子的唠唠叨  阅读(46)  评论(0编辑  收藏  举报