编程读写一个文件log_create.txt,每隔1秒向文件中写入一行记录

该程序应该无限循环,直到按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 #include #include #include #include //包含睡眠控制函数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++; //将用于记录的行号每次更新,下次计算时候要衔接上 }/此循环在首次运行时获得空文件,不执行。 //后续读取已有内容的文件并将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()函数,不用自己创建文件,会自动生成并读写更新日志内容。
可以看到,我第一次运行的结果如下:
编程读写一个文件log_create.txt,每隔1秒向文件中写入一行记录
文章图片

【编程读写一个文件log_create.txt,每隔1秒向文件中写入一行记录】我ctrl停掉之后,再执行一遍,来看一下是否会接着上一次的行号(第一个while循环来发挥作用)生成日志:
编程读写一个文件log_create.txt,每隔1秒向文件中写入一行记录
文章图片

可以看到,确实是衔接的很好,每次执行都会按照上一次的行号接着写!这是生成的日志文件:
编程读写一个文件log_create.txt,每隔1秒向文件中写入一行记录
文章图片

    推荐阅读