该程序应该有限循环,直到按Ctrl-C终止。下次再启动程序时在test.txt文件开端追加记录,并且序号可能接续上次的序号,比方:
1 2009-7-30 15:16:42
2 2009-7-30 15:16:43
3 2009-7-30 15:19:02
4 2009-7-30 15:19:03
5 2009-7-30 15:19:04
这相似于很多零碎服务保护的日志文件.
[阐明]
获取以后的零碎工夫须要调用time()函数,返回的后果是一个time_t类型,其实就是一个大整数,其值示意从UTC(Coordinated Universal Time)工夫1970年1月1日00:00:00(称为UNIX零碎的Epoch工夫)到以后时刻的秒数。而后调用localtime()将time_t所示意的UTC工夫转换为本地工夫(咱们是+8区,比UTC多8个小时)并转成struct tm类型,该类型的各数据成员别离示意年月日时分秒,具体用法请查阅Man Page。调用sleep()函数能够指定程序睡眠多少秒。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>//蕴含睡眠管制函数slepp();// struct tm//该构造体类型(tm)为内置类型,在time.h中,不必本人再反复定义// {// int tm_sec; /* 秒,范畴从 0 到 59 */// int tm_min; /* 分,范畴从 0 到 59 */// int tm_hour; /* 小时,范畴从 0 到 23 */// int tm_mday; /* 一月中的第几天,范畴从 1 到 31 */// int tm_mon; /* 月,范畴从 0 到 11(留神) */// int tm_year; /* 自 1900 年起的年数 */// int tm_wday; /* 一周中的第几天,范畴从 0 到 6 */// int tm_yday; /* 一年中的第几天,范畴从 0 到 365 */// int tm_isdst; /* 夏令时 */// };int main(){ FILE *file; struct tm *t1; time_t t;//c内置宏定义 // char * buf = (char *)malloc(100);不能定义成动静,要不每次执行过程会背地扭转行号 char buf[100]; int line = 0; memset(buf,0,sizeof(buf)); if ((file = fopen("log_create.txt", "a+")) < 0) { perror("failed to open log_create.txt"); exit(-1);//此处能够换成exit(1);exit(0)示意程序失常退出,非0示意非正常退出 } while( fgets(buf,sizeof(buf),file) != NULL){//逐行获取字符串 line++;//将用于记录的行号每次更新,下次计算时候要连接上 } while(1){ time(&t);//time_t time(time_t *timer), //如果 timer不为空,则返回值也存储在变量 timer即本例的t中 t1 = localtime(&t);//获取以后工夫 //struct tm *localtime(const time_t *timer) //应用 timer 的值来填充 tm 构造。timer 的值被合成为 tm 构造,并用本地时区示意 fprintf(file,"%d %d-%d-%d %d:%d:%d\n",++line, t1->tm_year + 1900, t1->tm_mon + 1, t1->tm_mday, t1->tm_hour, t1->tm_min, t1->tm_sec); //构造体tm中的tm_year是1900年到以后的工夫距离,tm_mom从一月开始,0代表一月 printf("%d %d-%d-%d %d:%d:%d\n",line, t1->tm_year + 1900, t1->tm_mon + 1, t1->tm_mday, t1->tm_hour, t1->tm_min, t1->tm_sec); fflush(file);//将改文件流cache写回缓存区,并使其写到内核或内存(设施)中! sleep(1);//能够指定程序睡眠多少秒 } fclose(file); return 0;}
本函数以a+追加形式应用fopen()函数,不必本人创立文件,会主动生成并读写更新日志内容。
能够看到,我第一次运行的后果如下:
我ctrl<C>停掉之后,再执行一遍,来看一下是否会接着上一次的行号生成日志:
能够看到,的确是连接的很好,每次执行都会依照上一次的行号接着写!这是生成的日志文件: