标准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 : [email protected]
* date : 2024/05/09
* function : 该案例需获取当前系统时间,把时间转换为特定格式”yy年mm月dd日
星期x tt:mm:ss”,并每隔1s写入到本地磁盘中一个叫做log.txt的文本中,
如果文本不存在则创建。
* note : 该案例需要调用localtime()函数、time()和相关标准IO函数,
并且对localtime函数获取值进行处理
*
* CopyRight (c) 2023-2024 [email protected] 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;
}
结果展示
总结
经过验证,上述代码可以基本完成题目要求。
但是可以对代码进行优化,例如上图中的星期4并不好看,或许可以通过枚举对其进行判断改名;又或是该文本写入后,数据只会从末尾开始写起,当用户需要对文本进行刷新输入的时候,目前程序无法办到。
总而言之,该题目的要求已基本达到,且加深了对于标准IO函数的使用,以及对于time()和localtime()的使用。
知识扩展
time()函数
注意:
- time()是有参数的,但是在使用过程中,一般填为NULL,再设置一个time_t 的变量接受其返回值
- time()是以秒为单位获取时间,且其返回值也是以秒为单位,其意义为从1970-01-01 00:00:00 到当前系统时间的秒数
localtime()函数
该函数的返回值是一个tm结构体指针变量,且需要传入一个time_t *作为参数。因此,该函数需要与time()一起使用。
注意:
- tm结构体中的变量均为 int 类型,且细分为年月日,时分秒。使用时可以利用结构体指针进行对其调用。
- tm结构体中的tm_year变量是当前系统时间减去1900后的数据,所以实际使用中需要加上1900得到当前系统时间年数值。
- tm结构体中的tm_mon变量意为月份,但是其数值范围为0-11与实际中1-12月份不同,所以实际使用中需要手动对其+1.