笔记
IO
二.IO基础
2.10有关系统时间的函数
有关时间的函数
cpp
#include <time.h>
time_t time(time_t *tloc);
功能:获取系统时间,从1970年1月1日0时0分0秒,到目前累计的秒数
参数:用于接收的秒数
返回值:秒数
使用方式:
1、time_t sys_time = time(NULL);
2、time_t sys_time = 0;
time(&sys_time);
struct tm *localtime(const time_t *timep);
功能:将time_t 秒数,转换为时间类型的结构体
参数:time_t 类型的时间秒数
返回值:时间结构体
struct tm {
int tm_sec; /* 秒数 */
int tm_min; /* 分钟 (0-59) */
int tm_hour; /* 小时 (0-23) */
int tm_mday; /* 月中天数 (1-31) */
int tm_mon; /* 月份+1 (0-11) */
int tm_year; /* 年 + 1900 */
int tm_wday; /* 周中天数 (0-6, Sunday = 0) */
int tm_yday; /* 年中天数 (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
2.11 sprintf\snprintf:将格式串转换为字符串
cpp
int sprintf(char *str, const char *format, ...);
功能:将格式串转换为字符串放入字符数组中
参数1:存放格式串的字符数组
参数2:格式串,可以包含格式控制符
参数3:可变参数,根据参数2中的格式控制符个数确定
返回值:成功返回转换的字符个数,失败返回-1
int snprintf(char *str, size_t size, const char *format, ...);
该函数比sprintf更加安全,因为多了一个size的限制
#include<myhead.h>
#include<time.h>
int main(int argc, const char *argv[])
{
//定义变量存储秒数
time_t sys_time = time(NULL);
//将秒数转换为结构体
struct tm *time_ptr = localtime(&sys_time);
char buf[128] = ""; //存放转变后的字符串
sprintf( buf,"%4d-%2d-%2d %2d:%2d:%2d\n",\
time_ptr->tm_year+1900,\
time_ptr->tm_mon+1,\
time_ptr->tm_mday,\
time_ptr->tm_hour,\
time_ptr->tm_min,\
time_ptr->tm_sec);
printf("buf = %s\n", buf);
return 0;
}
2.12 fprintf\fscanf:格式化读写函数
cpp
int fprintf(FILE *stream, const char *format, ...);
功能:向指定文件中写入一个格式串
参数1:文件指针
参数2:格式串,可以包含格式控制符
参数3:可变参数,根据参数2而定
返回值:成功返回写入文件的字符实际个数,失败返回-1
int fscanf(FILE *stream, const char *format, ...);
功能:将从文件中读取一些数据,放入到程序中来
参数1:文件指针
参数2:格式控制串
参数3:根据参数2而定
返回值:成功返回读取数据的个数,失败返回EOF并置位错误码
#include<myhead.h>
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp = NULL;
if((fp = fopen("./file.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//定义要存储的数据
int num = 18; //整形数据
printf("num = %d\n", num); //向终端输出
fprintf(fp ,"%d\n", num); //向fp指向的文件中输出
//关闭文件
fclose(fp);
//以只读的形式打开文件
if((fp = fopen("./file.txt", "r")) == NULL)
{
perror("fopen error");
return -1;
}
int key = 0;
fscanf(fp, "%d", &key); //从文件中读取一个数据
printf("key = %d\n", key);
//关闭文件
fclose(fp);
return 0;
}
2.13 fread\fwrite:模块化读写
cpp
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
功能:对文件进行模块化读写操作
参数1:要写入(存放数据)数据的起始地址
参数2:每一项的大小
参数3:总的项数
参数4:文件指针
返回值:成返回读取的项数值,失败返回小于项数的值
注意:fread并不能区分是文件结束了,还是因为出现错误了,需要使用feof或ferror来区分
1>使用fread、fwrite读写字符串
cpp
#include<myhead.h>
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp = NULL;
if((fp = fopen("./usr.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//准备字符串写入文件
char buf[] = "hello a\n";
fwrite(buf, 1, strlen(buf), fp); //单字符写入
fwrite(buf, strlen(buf), 1, fp); //单字串写入
//关闭文件
fclose(fp);
//以只读的形式打开文件
if((fp = fopen("./usr.txt", "r")) == NULL)
{
perror("fopen error");
return -1;
}
char rbuf[16] = ""; //要读取的内容
int res = fread(rbuf, 1, sizeof(rbuf), fp);
//printf("rbuf = %s\n", rbuf); //?
fwrite(rbuf, 1, res, stdout); //向标准输出写入内容
//关闭文件
fclose(fp);
return 0;
}
2>使用fread、fwrite读写整形数据
cpp
#include<myhead.h>
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp = NULL;
if((fp = fopen("./usr.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//向文件中写入一个整数
int num = 18;
fwrite(&num, sizeof(num), 1, fp);
//关闭文件
fclose(fp);
//以只读的形式打开文件
if((fp = fopen("./usr.txt", "r")) == NULL)
{
perror("fopen error");
return -1;
}
int key = 0;
//读取数据
fread(&key, sizeof(key), 1, fp);
printf("key = %d\n", key);
//关闭文件
fclose(fp);
return 0;
}
3>使用fread、fwrite读写结构体
cpp
#include<myhead.h>
//定义结构体类型
typedef struct
{
int numb; //学号
char name[20]; //姓名
int age; //年龄
double score; //成绩
}Stu;
/**********************主程序*********************/
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp = NULL;
if((fp = fopen("./usr.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//定义三个学生
Stu s[3] = {{1001, "大狗", 30, 98}, \
{1002, "二狗", 25, 100}, \
{1003, "天明", 23, 80}};
//将这三名学生信息写入文件中
fwrite(s, sizeof(Stu), 3, fp);
//关闭文件
fclose(fp);
//以只读的形式打开文件
if((fp = fopen("./usr.txt", "r")) == NULL)
{
perror("fopen error");
return -1;
}
//定义接收取出的学生
Stu temp;
fread(&temp, sizeof(temp), 1, fp);
fread(&temp, sizeof(temp), 1, fp);
printf("学号:%d, 姓名:%s,年龄:%d,成绩%.2lf\n",\
temp.numb, temp.name, temp.age, temp.score);
//关闭文件
fclose(fp);
return 0;
}
2.14关于文件光标的函数
cpp
#include<myhead.h>
//定义结构体类型
typedef struct
{
int numb; //学号
char name[20]; //姓名
int age; //年龄
double score; //成绩
}Stu;
/**********************主程序*********************/
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp = NULL;
if((fp = fopen("./usr.txt", "w")) == NULL)
{
perror("fopen error");
return -1;
}
//定义三个学生
Stu s[3] = {{1001, "大狗", 30, 98}, \
{1002, "二狗", 25, 100}, \
{1003, "天明", 23, 80}};
//将这三名学生信息写入文件中
fwrite(s, sizeof(Stu), 3, fp);
//关闭文件
fclose(fp);
//以只读的形式打开文件
if((fp = fopen("./usr.txt", "r")) == NULL)
{
perror("fopen error");
return -1;
}
//定义接收取出的学生
Stu temp;
fread(&temp, sizeof(temp), 1, fp);
fread(&temp, sizeof(temp), 1, fp);
printf("学号:%d, 姓名:%s,年龄:%d,成绩%.2lf\n",\
temp.numb, temp.name, temp.age, temp.score);
//关闭文件
fclose(fp);
return 0;
}
作业
1> 写一个日志文件,将程序启动后,每一秒的时间写入到文件中
1、2024- 7-29 10:31:19
2、2024- 7-29 10:31:20
3、2024- 7-29 10:31:21
ctrl+c:停止程序 ./a.out
4、2024- 7-29 10:35:06
5、2024- 7-29 10:35:07
6、2024- 7-29 10:35:08
cpp
#include <myhead.h>
int main(int argc, const char *argv[])
{
FILE*fp=NULL;
if((fp=fopen("./time.txt","a+"))==NULL)
{
printf("open file error\n");
return-1;
}
time_t sys_time=time(NULL);//定义一个time_t类型的变量并初始化
int flag=0;
time(&sys_time);//通过time函数将获得的秒数赋给sys_time
struct tm *now;//定义一个tm类型的结构体
now=localtime(&sys_time);//将sys_time里的值转为tm类型的结构体并赋给now
flag=now->tm_sec;
while(1)
{
time(&sys_time);
now=localtime(&sys_time);
if(flag!=now->tm_sec)
{
if((fp=fopen("./time.txt","a+"))==NULL)
{
printf("open file error\n");
return-1;
}
fprintf(fp,"%d-%d-%d %02d:%02d:%02d",1900+now->tm_year,1+now->tm_mon,now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec);
fprintf(fp,"\n");
flag=now->tm_sec;
fclose(fp);
}
}
return 0;
}
2> 使用fread、fwrite完成两个文件的拷贝
不允许只读写一次
cpp
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(argc!=3)
{
printf("open file error!\n");
return -1;
}
FILE *fp=NULL;
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("open error\n");
return -1;
}
FILE *fd=NULL;
if((fd=fopen(argv[2],"w"))==NULL)
{
printf("open error\n");
return -1;
}
char temp={0};
while(1==fread(&temp,1,sizeof(temp),fp))
{
fwrite(&temp,1,sizeof(temp),fd);
}
fclose(fp);
fclose(fd);
return 0;
}