1.2 IO进程day2

本文详细介绍了C语言中使用fread/fwrite进行文件内容拷贝,以及实现注册登录功能,包括文件IO操作、标准IO区别、文件指针的应用,以及单向链表中环的检测方法。
摘要由CSDN通过智能技术生成

思维导图

1.用fread、fwrite函数实现两个文件的拷贝

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
	//定义一个文件指针
	FILE *fp1=NULL;
	//以只读的形式打开文件
	if((fp1=fopen("./text.txt","r"))==NULL)
	{
		perror("fopen error");
		return -1;
	}
	//定义一个容器,用来存储文件的内容
	char buf[1024]="";
	while(1)
	{
		//将文件中的字符串拷贝到容器中
		char *res=fgets(buf,sizeof(buf),fp1);
		//结束拷贝
		if(res==NULL)
			break;
		//将拷贝的内容放到容器中
		printf("%s",buf);
	}
	//关闭文件
	fclose(fp1);
	//定义一个文件指针,以只写的形式打开文件
	FILE *fp2=NULL;
	if((fp2=fopen("./text1.txt","w"))==NULL)
	{
		perror("fopen error");
		return -1;
	}
	//调用fwrite函数将数据写入文件
	fwrite(buf,1,sizeof(buf),fp2);
	//关闭文件
	fclose(fp2);
	//以只读的形式再次打开文件
	if((fp2=fopen("./text1.txt","r"))==NULL)
	{
		perror("fopen error");
		return -1;
	}
	//读取文件内容
	char rbuf[100]="";
	fread(rbuf,1,sizeof(rbuf),fp2);
	//输出rbuf数据
	fwrite(rbuf,1,sizeof(rbuf),stdout);
	//关闭文件
	fclose(fp2);

	return 0;
}

2.将注册登录框架重新实现一遍

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
//定义注册函数
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_reg_log[20];
	char pwd_reg_log[20];
	//定义变量存储文件读取的账号和密码
	char userName[20];
	char pwd[20];
	//输入账号和密码
	printf("输入注册账号:");
	fgets(userName_reg_log,sizeof(userName_reg_log),stdin);
	printf("输入注册密码:");
	fgets(pwd_reg_log,sizeof(pwd_reg_log),stdin);
	//将两字符串中换行改成\0
	userName_reg_log[strlen(userName_reg_log)-1]='\0';
	pwd_reg_log[strlen(pwd_reg_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_reg_log,userName)==0&&strcmp(pwd_reg_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;
}

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

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
	//定义文件指针打开文件
    FILE *fp = NULL;
    if((fp = fopen("./ts.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] = {0, 0, 255};
	//将光标偏移到图像数据处
    fseek(fp, 54, SEEK_SET);
	//外行循环
    for(int i=0; i<300; i++)   
	{
		//内列循环
        for(int j=0; j<1192; j++)
		{
            fwrite(color, sizeof(color), 1, fp);
        }
    }
    //关闭文件
    fclose(fp);
	return 0;
}

面试题:

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

        都是用于读取和写入数据的操作:程序对外部设备完成信息交换的操作。

        标准IO依赖于库函数,程序提供的函数;文件IO依赖于系统调用,内核提供函数;

        缓存机制:文件IO没有缓冲区,标准IO比文件IO多了缓冲区:标准IO=文件IO+缓冲区;

        系统调用:文件IO能直接将用户空间和内核空间进行信息操作,需要使用文件操作符。而标准IO使用文件指针,需要通过缓冲区进行信息操作;

        性能:由于文件IO每次调用系统调用函数,需要用户空间和内核空间进行切换一次,调用 一次切换一次,效率低。而标准IO只需缓冲区刷新时机到就能调用一次,效率高。

2.什么是IO

        IO就是程序对外部设备完成信息交换的操作,即读取和写入;

        分为文件IO和标准IO,标准IO=文件IO+缓冲区

3.什么是文件指针

        是指向文件地址的一个特殊指针,用FILF *来定义,来源于stdio.h库中定义的结构体类型;结构体中包括缓冲区和用于系统调用的文件描述符;

        作用是:用来描述整个文件信息,帮助我们对文件进行操作,是关联文件和程序的重要桥梁;
        如何用:通过fopen返回得到文件地址,后期可以使用IO函数,将指针当作参数来操作文件

4.简述系统调用

        系统调用是通过文件描述符使用内核提供的函数对系统进行调用,并从用户空间向内核空间进行一次切换,效率较低;

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

        遍历链表,并将每个节点的指针域存储。如果遇见出现过的节点,那么就说明链表中存在环。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值