linux的时间戳

本文介绍了C语言中time.h库的time()函数用于从内核获取时间,gmtime()和localtime()用于时间转换,以及strftime()函数进行格式化。通过一个实例演示了如何实时记录时间并按特定格式输出。讨论了fflush()在缓冲管理中的作用,包括全缓冲、行缓冲和无缓冲的区别。
摘要由CSDN通过智能技术生成

1. time

NAME
       time - get time in seconds

SYNOPSIS
       #include <time.h>

       time_t time(time_t *t);

从内核当中取出时间
time_t是一个64位的大整数
失败的话会返回一个宏值,并且设置errno

2.时间转化函数

struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);
time_t mktime(struct tm *tm);
           struct tm {
               int tm_sec;         /* seconds */
               int tm_min;         /* minutes */
               int tm_hour;        /* hours */
               int tm_mday;        /* day of the month */
               int tm_mon;         /* month */
               int tm_year;        /* year */
               int tm_wday;        /* day of the week */
               int tm_yday;        /* day in the year */
               int tm_isdst;       /* daylight saving time */
           };

3.格式化字符串

#include <time.h>

size_t strftime(char *s, size_t max, const char *format,
                const struct tm *tm);

4.一个Demo

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define FILENAME "time.log"
#define MAXSIZE 1024

int main(int argc, char **argv)
{
        FILE *pFile;
        int nCount = 0;
        char Buf[MAXSIZE];
        time_t Int64Time;
        struct tm *pTime;

        pFile = fopen(FILENAME, "a+");
        if(NULL == FILENAME)
        {
                perror("fopen() ");
                exit(1);
        }

        while(NULL != (fgets(Buf, MAXSIZE, pFile) ))
        {
                nCount++;
        }


        while(1)
        {
                time(&Int64Time);
                pTime = localtime(&Int64Time);
                fprintf(pFile, "%-4d %d-%d-%d %d:%d:%d\n", nCount++,\
                 pTime->tm_year+1900, pTime->tm_mon+1, pTime->tm_mday,\
                 pTime->tm_hour, pTime->tm_min, pTime->tm_sec);
                fflush(pFile);
                sleep(1);
        }


        fclose(pFile);

        return 0; 
}

在这里插入图片描述

5.这里存在的一个问题

fflush(pFile);
如果我们不刷新缓冲区的话 只能等到缓冲区占满后,才会显示出一大段内容
1.1 全缓冲区
在这种情况下,在填满I/O缓冲区后再进行实际的I/O操作。对于驻留在磁盘上的文件通常由标准I/O库实施全缓冲。调用fflush函数冲洗一个流。冲洗意味着将缓冲区的内容写到磁盘上。

对应一个BUFFSIZE,只要没超过buffsize就能一直缓冲,一般在使用之前进行fflush,进行缓冲区的刷新,也就是清空缓冲区,但这里的清空的意思不是删除,只是把缓冲区的内容给逼出去。全缓冲一般是默认开启的。

1.2、行缓冲
在这种情况下,当在输入和输出遇到换行符时,标准I/O执行I/O操作。允许我们一次输出一个字符。涉及一个终端时,通常使用行缓冲。

类似"scanf()" “gets()” “puts()”
再遇到 \n 的时候进行输入或输出

1.3 无缓冲
标准I/O不对字符进行缓冲处理。例如:如果标准I/O函数fputs写15个字符到不带缓冲的流上,就会调用write的相关的函数立即写入打开的文件上。
read
write
strerr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值