今日思维导图
1.关于时间的操作
#include <time.h>
time_t time(time_t *t);
功能:获取系统当前时间的毫秒数
参数:如果是NULL,则通过返回值返回毫秒数
如果参数不是NULL,则可以通过参数得到毫秒数
返回值:成功返回毫秒数,失败返回time_t类型的-1,并置位错误码
struct tm*localtime(const time_t *timep);
功能:通过给定的毫秒数,转变成时间
参数:毫秒数
返回值:struct tm结构体指针,失败返回NULL,并置位错误码
2.sprintf函数
#include<stdio.h>
int sprintf(char *str, const char *format, ...);
功能:向给定的字符数组中,存放进行了格式化后的字符串
参数1:字符数组首地址
参数2:格式串
参数3:格式串对应的可变参数
返回值:成功返回格式串的长度,失败返回负数
3.snprintf函数
int sprintf(char *str, int size,const char *format, ...);
功能:将格式串转换为字符串,但是有长度size控制,并在后面补上'\0'
参数1:存放格式化串的数组
参数2: 格式化的长度
参数3:格式控制串
参数4:格式串对应的可变参数
4.fprintf函数
int fprintf(FILE *stream,const char *format,...)
功能:向给定文件中写入一个格式串
参数1:文件指针
参数2:格式化串
参数3:不定参数,根据格式化串的格式控制符;来确定个数
返回值:成功返回格式串的长度,失败返回负数
5.fscanf函数
int fscanf(FILE *stream,const char *format,...)
功能:向给定文件中,以格式化控制符从文件中摘取数据放入程序中
参数1:文件指针
参数2:格式化串
参数3:地址列表
返回值:成功返回格式串的长度,失败返回EOF并置位错误码
6.fread,fwrite函数的使用
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从给定文件中,读取nmemb项数据,每项数据大小为size,将数据放入ptr中
参数1:存放数据的指针,是一个万能指针,可以接受任意类型的数据
参数2:读取数据每一项的大小
参数3:读取的项数
参数4:文件指针
返回值:成功返回读取的项数,当size为1时,就是成功读取的字节数,失败返回小于项数的值或0
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
功能:将ptr指向的数据,每项数据的大小为size,一共有nmemb项,写入stream文件中
参数1:存放数据的指针,是一个万能指针,可以接受任意类型的数据
参数2:读取数据每一项的大小
参数3:读取的项数
参数4:文件指针
返回值:成功返回读取的项数,当size为1时,就是成功读取的字节数,失败返回小于项数的值或0
作业
获取系统时间,并将系统时间写入文件中,实现现象
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int argc,const char *argv[])
{
FILE *fp;
if((fp=fopen("./time.txt","a+"))==NULL)
{
perror("open file");
return -1;
}
int i=0;
while(i!=3)
{
time_t sys_time=time(NULL);//获取系统时间的毫秒数
//将毫秒数转变成时间结构体
struct tm* fomattime=localtime(&sys_time);
fprintf(fp,"%4d-%2d-%2d %2d:%2d:%2d\n",fomattime->tm_year+1900\
,fomattime->tm_mon+1,\
fomattime->tm_mday,\
fomattime->tm_hour,\
fomattime->tm_min,\
fomattime->tm_sec);
i++;//控制循环次数
sleep(1);//睡一秒
}
return 0;
}
改进:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int getLine(FILE *fp)
{
char buf[10];//读取数据的容器
int line=0; //记录行号
while(fgets(buf,sizeof(buf),fp)!=NULL)
{
if(buf[strlen(buf)-1]=='\n')
{
line++;
}
}
return line;
}
int main(int argc,const char *argv[])
{
//定义接受秒钟的变量
time_t currentTime,oldTime;
//定义系统时间的结构体变量
struct tm*sysTime;
//定义文件指针,用于打开文件
FILE *fp;
//定义格式串用于存储时间
char buf[100];
//定义变量记录获取文件的行号
int line;
if((fp=fopen("./tim.txt","a+"))==NULL)
{
perror("open file error");
return 1;
}
//获取文件的行号
line=getLine(fp);
int count=0;
while(count!=3)
{
currentTime=time(NULL);//获取系统时间的秒钟数
sysTime=localtime(¤tTime);//将秒钟数转化为系统时间
if(currentTime!=oldTime)
{
oldTime=currentTime;
sprintf(buf,"%3d.%4d-%02d-%02d %02d:%02d:%02d\n",
++line,
sysTime->tm_year+1900,
sysTime->tm_mon+1,
sysTime->tm_mday,
sysTime->tm_hour,
sysTime->tm_min,
sysTime->tm_sec
);
//将文件写入字符串
fputs(buf,fp);
fflush(fp);
count++;
}
}
return 0;
}
用fread 和 fwrite实现拷贝
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define err(x) perror(x);return-1;
int main(int argc,const char *argv[])
{
//fwrite fread 实现copy
if(argc!=3)
{
puts("error");
puts("usage:./a.out srcfile destfile");
return -1;
}
FILE *srcfile,*destfile;
char str[20]={0};
if((srcfile=fopen(argv[1],"r"))==NULL)
{
err("open file");
}
if((destfile=fopen(argv[2],"w"))==NULL)
{
err("open file");
}
int ret;
while((ret=fread(str,sizeof(char),1,srcfile))!=0);
{
fwrite(str,sizeof(char),1,destfile);
}
fclose(srcfile);
fclose(destfile);
return 0;
}