IO进程线程 day2

IO进程线程 day2_第1张图片

 1.使用fread、fwrite完成两个文件的拷贝

#include 
#include 
#include 
int main(int argc, const char *argv[])
{
	//判断输入是否合法
	if(argc>3)
	{
		printf("输入不合法\n");
		return -1;
	}
	//定义两个文件指针,用于读写
	FILE *fp1=NULL;
	FILE *fp2=NULL;
	if((fp1=fopen(argv[1],"r"))==NULL)
	{
		perror("");
		return -1;
	}
	if((fp2=fopen(argv[2],"w"))==NULL)
	{
		perror("");
		return -1;
	}
	//循环读取搬运
	while(1)
	{
		char buf[20];//定义搬运工
		int res=fread(buf,1,sizeof(buf),fp1);//循环读取字符
		fwrite(buf,1,res,fp2);//将字符拷贝到第二个文件中
		if(feof(fp1))//执行上述操作后,判断光标位置
		{
			break;//如果光标在结尾则退出循环
		}
	}
	//关闭两个文件
	fclose(fp1);
	fclose(fp2);
	return 0;
}

2、实现注册登录框架

#include
#include
#include

//定义注册函数
int do_register()
{
    //1、以追加的形式打开文件
    FILE * wfp = NULL;
    char userName_reg[20];        //注册账号
    char pwd_reg[20];             //注册密码

    //提示输出注册账号和密码
    printf("请输入注册账号:");
    fgets(userName_reg, sizeof(userName_reg), stdin);
    printf("请输入注册密码:");
    fgets(pwd_reg, sizeof(pwd_reg), stdin);

    //将两个字符串中的换行改成'\0'
    userName_reg[strlen(userName_reg)-1] = '\0';
    pwd_reg[strlen(pwd_reg)-1] = '\0';

    //打开文件
    if((wfp = fopen("./usr.txt", "a+")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //2、将注册账号和注册密码写入到文件中,中间有空格隔开,每组用换行隔开
    fprintf(wfp, "%s %s\n", userName_reg, pwd_reg);
    

    //3、关闭文件
    fclose(wfp);

    printf("注册成功\n");
    return 0;
}



//自定义登录功能
int do_login()
{
    //定义容器存放登录账号和登录密码
    char userName_log[20];
    char pwd_log[20];

    //定义变量存储文件读取的账号和密码
    char userName[20];
    char pwd[20];

    //提示并输入登录账号和密码
    printf("请输入登录账号:");
    fgets(userName_log, sizeof(userName_log), stdin);
    printf("请输入登录密码:");
    fgets(pwd_log, sizeof(pwd_log), stdin);

    //将两个字符串中的换行改成'\0'
    userName_log[strlen(userName_log)-1] = '\0';
    pwd_log[strlen(pwd_log)-1] = '\0';

    //打开文件,进行账号和密码的比对
    FILE *rfp = NULL;
    if((rfp = fopen("./usr.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //循环遍历所有文件中的账户
    while(1)
    {
        int res = fscanf(rfp, "%s %s", userName, pwd);    //读取文件中的用户
        if(res < 0)
        {
            printf("登录失败\n");
            //关闭文件
            fclose(rfp);
            return 1;             //表示登录失败
        }

        //判断登录账号和密码是否匹配
        if(strcmp(userName_log,userName)==0  &&  strcmp(pwd_log, pwd)==0)
        {
            printf("登录成功\n");
            //关闭文件
            fclose(rfp);
            return 0;
        }
    }
}





/**********************主程序******************************/
int main(int argc, const char *argv[])
{

    //定义一个变量存储功能选项
    char menu;

    //制作菜单框架
    while(1)              //重复使用菜单框架
    {
        printf("\t\t=====1、注册=====\n");
        printf("\t\t=====2、登录=====\n");
        printf("\t\t=====0、退出=====\n");

        printf("请输入功能选项:");
        scanf("%c", &menu);
        while(getchar() != '\n');        //吸收垃圾字符以及回车

        //对菜单选项多分支选择
        switch(menu)
        {
        case '1':
            {
                //执行注册功能
                do_register();
            }
            break;

        case '2':
            {
                //执行登录功能
                do_login();
            }
            break;

        case '0':
            exit(EXIT_SUCCESS);           //退出程序

        default:printf("您输入的功能有误请重新输入!!!\n");
        }

        printf("请输入任意键按回车清屏!!!\n");
        while(getchar() != '\n');
        system("clear");               //调用终端指令清屏
    }

    return 0;
}

IO进程线程 day2_第2张图片IO进程线程 day2_第3张图片

 3.完成图像文件信息的读写操作

#include 
int main(int argc, const char *argv[])
{
    //定义文件指针打开文件
    FILE *fp = NULL;
    if((fp = fopen("./dlam.bmp", "r+")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //向后偏移两个字节得到文件的大小
    fseek(fp, 2, SEEK_SET);

    unsigned int size;
    fread(&size, sizeof(size), 1, fp);   //从文件中读取一个整形数据
    printf("size = %d\n", size);

    //想要更改像素
    unsigned char color[3] = {255, 0, 0};    //纯蓝色

    //将光标偏移到图像数据处
    fseek(fp, 54, SEEK_SET);

    for(int i=0; i<100; i++)   //外行
    {
        for(int j=0; j<640; j++)   //内列
        {
            fwrite(color, sizeof(color), 1, fp);
        }
    }
    //关闭文件
    fclose(fp);

    return 0;
}

 

面试题整理

1.标准IO和文件IO的区别

答:标准IO依赖于库函数,由程序提供,有缓冲区

文件IO依赖于系统调用,有内核提供,无缓冲区

2.什么是IO

答:I:input输入;O:output输出;是程序于外部设备交换信息的过程

3.什么是文件指针

答:指向文件地址的指针,是stdio.h中定义的结构体类型

用于描述文件信息,使用fopen函数打开,返回操作句柄为文件指针

可以通过指针操作文件

4.简述系统调用

答:依赖于文件描述符;依赖于内核提供的库函数;进行系统调用,程序由用户空间向内核切换

5.如何判断一个单向链表有环

答:遍历链表,查看是否有节点被多次访问

你可能感兴趣的:(嵌入式学习-IO进程线程,linux)