乐趣区

关于c:编程读写一个文件logcreatetxt每隔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 <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> 停掉之后,再执行一遍,来看一下是否会接着上一次的行号生成日志:

能够看到,的确是连接的很好,每次执行都会依照上一次的行号接着写!这是生成的日志文件:

退出移动版