time:
time_t time(time_t *t);
如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间。
注意,time
函数本身只返回从1970年1月1日00:00:00(unix纪元)开始的总秒数,并不直接提供日期或时间的格式化表示。如果你想要获取并打印出具体的日期和时间(如年、月、日、时、分、秒),你可以使用localtime
或gmtime
函数将time_t
值转换成struct tm
结构体,然后使用strftime
函数来格式化日期和时间。
localtime:
struct tm *localtime(const time_t *timep);
返回值是结构体指针,所指结构体封装着年月日时分秒
#include <stdio.h>
#include <time.h>
int main() {
time_t rawtime;
struct tm * timeinfo;
// 获取当前时间的时间戳
time(&rawtime);
// 将时间戳转换为本地时间
timeinfo = localtime(&rawtime);
// 打印本地时间
printf("当前本地时间:%d-%d-%d %d:%d:%d\n",
timeinfo->tm_year + 1900, // 年份需要加上1900
timeinfo->tm_mon + 1, // 月份从0开始计数,所以需要加1
timeinfo->tm_mday,
timeinfo->tm_hour,
timeinfo->tm_min,
timeinfo->tm_sec);
return 0;
}
fprintf:
格式化输出到流(stream)文件中,返回值是输出的字符数,发生错误时返回一个负值.
sprintf:
int sprintf( char *buffer, const char *format, ... );
格式化输出发送到buffer(缓冲区)中.返回值是写入的字符数量.
练习
1.编程读写一个文件test.txt,每隔1秒向文件中写入一行录入时间的数据,类似这样:
1, 2024-8-24 15:16:42
2, 2024-8-24 15:16:43
该程序应该无限循环,直到按Ctrl-C中断程序。
再次启动程序写文件时可以追加到原文件之后,并且序号能够接续上次的序号,比如:
1, 2024-8-24 15:16:42
2, 2024-8-24 15:16:43
3, 2024-8-24 15:19:02
4, 2024-8-24 15:19:03
5, 2024-8-24 15:19:04
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char const *argv[])
{
FILE *fp;
if (argc != 2)
{
printf("put err");
return -1;
}
fp = fopen(argv[1], "r+");//打开文件流
if (NULL == fp)//容错判断
{
printf("fopen err");
return -1;
}
time_t nowtime;
struct tm *timep = NULL;
char buf[64] = {};
int len = 0;
while (fgets(buf, 64, fp) != NULL)//当fgets遍历到尾时返回NULL
{
if (buf[strlen(buf) - 1] == '\n')//当数组中最后一个数等于\n时即改行结束行数+1
len++;
}
while(1)
{
len++;
time(&nowtime);//将当前时间存入nowtime中
timep=localtime(&nowtime);//将转换后的时间返回到结构体指针timep中
fprintf(fp,"%d, %d-%d-%d %d:%d:%d\n",len,timep->tm_year+1900,timep->tm_mon+1,timep->tm_mday,timep->tm_hour,timep->tm_min,timep->tm_sec);//将信息输出到文件流中
//time函数是获取1970年1月1日00:00:00(unix纪元)至今的时间,单位是秒
//里面的参数年是-1900之后的年份,月份是0-11,所以需要调整一下
fflush(fp);//刷新缓存区,将缓存区中的数据输出出来
sleep(1);//延时1秒输出
}
return 0;
}