7.29IO进程线程

笔记

IO

二.IO基础

2.10有关系统时间的函数

        有关时间的函数

#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:将格式串转换为字符串
       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:格式化读写函数
       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:模块化读写
       #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读写字符串

#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读写整形数据

#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读写结构体

#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关于文件光标的函数
#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

#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完成两个文件的拷贝

不允许只读写一次

#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;
}

  • 25
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值