IO进程线程Day2

IO进程线程Day2_第1张图片

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

#include
#include
#include
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 
#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("./sts.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_reg_log[20];
 
	//定义变量存储文件读取的账号和密码
	char userName[20];
	char pwd[20];
 
	//提示输入登录账号和密码
	printf("请输入登录账号");
	fgets(userName_log, sizeof(userName_log), stdin);
	printf("请输入登录密码");
	fgets(pwd_reg_log, sizeof(pwd_reg_log), stdin);
 
	//将两个字符串中的换行改成'\0'
	userName_log[strlen(userName_log)-1] = '\0';
	pwd_reg_log[strlen(pwd_reg_log)-1] = '\0';
 
	//打开文件,进行账号和密码的比对
	FILE * rfp = NULL;
	if((rfp = fopen("./sts.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_reg_log, pwd)== 0)
		{
			printf("登录成功\n");
			//关闭文件
			fclose(rfp);
			return 0;
		}
	}
}
 
int main(int argc, const char *argv[])
{
	//定义一个变量存储功能选项
	char num;
	//制作菜单框架
	while(1) 		//重复使用菜单框架
	{
		printf("\t\t====1、注册====\n");
		printf("\t\t====2、登录====\n");
		printf("\t\t====0、退出====\n");
		
		printf("请输入功能选项:");
		scanf("%c",&num);
		while(getchar() != '\n'); 	//循环吸收垃圾字符以及回车,清空缓存区
		//对菜单选项多分支选择
		switch(num){
			case '1':{
					 //执行注册功能
					do_register();
				}
				break;
			case '2':{
					//执行登录功能
					do_login();
				}
				break;
			case '0':
				exit(EXIT_SUCCESS); 		//退出程序
 
			default:printf("您输入的功能有误请重新输入!!!\n");		
		}
 
		//输入任意键清屏
		printf("请按任意键输入回车清屏!!!");
		while(getchar() != '\n');
		system("clear"); 			//调用终端清屏
 
	}
	return 0;
}

3> 完成图像文件信息的读写

#include 

int main(int argc, const char *argv[]){
	FILE *fp=NULL;
	if(NULL==(fp=fopen("./output.bmp","r+")))
	{
		perror("fopen error:");
		return -1;
	}

	//向后偏移两个字节得到文件的大小
	fseek(fp, 0x02, SEEK_SET);
 
	unsigned int size;
	fread(&size, sizeof(size), 1, fp);   //从文件中读取一个整形数据
	printf("size = %d\n", size);


	unsigned int x,y;
	//向后偏移两个字节得到分辨率的大小
	fseek(fp, 0x12, SEEK_SET);	
	fread(&x, sizeof(size), 1, fp);   //从文件中读取一个整形数据
	fread(&y, sizeof(size), 1, fp);   //从文件中读取一个整形数据
	printf("x = %d\ny = %d\n", x,y);


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

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

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

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

文件IO是没有缓冲区的,标准io有缓冲区,标准io输入输出效率较高

文件IO与操作系统绑定,可移植性,复用差,标准io则比较好

标准io使用流指针对文件进行操作,文件IO使用文件描述符操作

2.什么是IO

        IO就是程序对外部设备完成信息交换的操作,即读取和写入,分为标准IO和文件IO。

3.什么是文件指针

        是指向文件地址的一个特殊指针,用FILF *来定义,来源于stdio.h库中定义的结构,用来描述整个文件信息,帮助我们对文件进行操作,使用时通过fopen返回得到文件地址,可使用IO函数,将指针当作参数来操作文件。

4.简述系统调用
        系统调用是用户空间程序与内核空间交互的一种方式,允许用户程序执行一些只有操作系统内核能够执行的特权操作。

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

        遍历整个链表,判断某个结点地址是否被多次访问。

你可能感兴趣的:(开发语言)