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