IO作业2.0

news2024/12/22 4:46:14

思维导图

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	if(argc != 3)  	//判断外部参数	
	{
		printf("The terminal format is incorrect\n");
		return -1;
	}
	//定义文件指针
	FILE * fp = NULL;
	FILE * fq = NULL;
	//以只读的形式打开文件
	if((fp = fopen(argv[1],"r")) == NULL)
	{
		perror("fopen error");
		return -1;
	}
	//以只写的形式打开文件
	if((fq = fopen(argv[2],"w")) == NULL)
	{
		perror("fopen error");
		return -1;
	}
	char buf[100]; 	//定义一个文件搬运工
	while(1)
	{
		fread(buf, sizeof(buf), 1, fp);
   		fwrite(buf, sizeof(buf), 1, fq);
		if(feof(fp))
		{
			printf("读取到文件结尾\n");
			break;
		}
		if(ferror(fp))
		{
			printf("读取失败\n");
			break;
		}
	}
	//关闭文件
	fclose(fp);
	fclose(fq);

	printf("拷贝成功\n");
	return 0;
} 

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

#include <stdio.h>
#include <string.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("./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 <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	//定义文件指针打开文件
    FILE *fp = NULL;
    if((fp = fopen("./无标题.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] = {123, 10, 150};   
    //将光标偏移到图像数据处
    fseek(fp, 54, SEEK_SET);
    
    for(int i=0; i<1473; i++)  //外层   
	{
        for(int j=0; j<648; j++)   //内列
        {
            fwrite(color, sizeof(color), 1, fp);
        }
    }

    //关闭文件
    fclose(fp);

    return 0;
}

标准IO和文件IO的区别:

标准IO=文件IO+缓冲区

标准IO依赖于库函数,该函数包含了一个缓冲区,该函数会将数据统一放入缓冲区,等待缓冲物时间刷新后,进行一并调用到内核,效率较高

文件IO属于内核提供的函数,依赖于系统调用,每进行一次系统调用,程序都会从用户空间向内核进行一次调换,效率偏低

什么是IO:

程序对外部设备完成信息交换的过程

什么是文件指针:

指向文件地址的指针,该类型是在stdio.h中定义了一个用于描述文件所有信息的结构体

作用:用于描述文件信息,是文件的操作句柄

内涵:包含了缓冲区和文件描述符

简述系统调用:

属于内核,依赖的句柄有文件描述符

每进行一次系统调用,程序都会从用户空间向内核进行一次调换,效率偏低

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

在遍历结果时,若是有一个节点地址被多次访问,则证明有环

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刚来实习就跑路,可行么?

最近 编程导航 的一位鱼友问了个让我血压升高的问题&#xff1a; 鱼友提问 鱼皮你好&#xff0c;我投了两周简历&#xff0c;然后昨天面了一个小厂的远程实习并且拿到了 offer&#xff0c;我要不要试试呢&#xff1f; 我在顾虑比如我如果在远程实习期间找到一个中厂或者大厂…

GPT-4在概念推理任务表现不如人类,还需继续学习提高!

圣达菲研究所的科研人员对 GPT-4在推理和抽象能力方面与人类的差距进行了定量研究。他们使用 ConceptARC 基准测试评估了 GPT-4在文本和多模态方面的表现&#xff0c;并发现 GPT-4仍然与人类存在较大差距。对于 GPT-4的抽象推理能力&#xff0c;研究人员发现&#xff0c;无论是…

浏览器---善用的一些调试技巧

https://www.cnblogs.com/dasusu/p/17932742.html

初识Linux下进程

&#x1f30e;初识进程 初识进程 简单认识一下进程 如何管理进程 进程属性信息 内核运行队列 查看进程 通过系统调用获取进程标识符       父子进程       查看运行中的进程 总结 前言&#xff1a; 我们在电脑上点开的一个个应用&#xff0c;其实就是一个个进程&am…

计算机网络(7):网络安全

网络安全问题 计算机网络上的通信面临以下的四种威胁: (1)截获(interception)攻击者从网络上窃听他人的通信内容。 (2)中断(interruption)攻击者有意中断他人在网络上的通信。 (3)篡改(modification)攻击者故意篡改网络上传送的报文。 (4)伪造(fabrication)攻击者伪造信息在网…

DrGraph原理示教 - OpenCV 4 功能 - 阈值

普通阈值 OpenCV中的阈值用于相对于提供的阈值分配像素值。在阈值处理中&#xff0c;将每个像素值与阈值进行比较&#xff0c;如果像素值小于阈值则设置为0&#xff0c;否则设置为最大值&#xff08;一般为255&#xff09;。 在OpenCV中&#xff0c;有多种阈值类型可供选择&am…

融资项目——异常处理

当前端请求后端服务的时候&#xff0c;如果后端出现bug。会返回给前端通用的500异常结果。 但是在项目开发中&#xff0c;我们一般会定义一个统一结果类R用于返回结果数据&#xff0c;所以我们希望将错误也用统一结果类对象返回给前端。 1. 同一异常处理器。 面对一般的错误&…

二维码地址门牌系统技术服务:让您的生活更便捷,一码通行,安全无忧

文章目录 前言一、融合二维码技术与门牌的便捷服务二、手机开门便捷功能三、智能化安全保障四、智能化、便捷化的新型技术 前言 在数字化时代&#xff0c;二维码门牌系统技术应运而生&#xff0c;为了满足人们对安全、便捷生活的需求。这项技术将二维码与门牌结合&#xff0c;…

关于各种浏览器或操作系统深色模式的设置,看这篇文章就够了

无论你是在家里设立办公室,还是带着笔记本电脑去当地的咖啡馆,或者在格子间度过一天,都可以通过在网络浏览器中启用深色模式来让你的眼睛休息一下。 深色模式不会改变你访问的页面的颜色(这是由网站开发者设置的);它将使工具栏和“设置”页面更容易查看,尤其是在冬季较…

centos7通过systemctl启动springboot服务代替java -jar方式启动

背景&#xff1a;以前启动jar包都是通过java -jar&#xff0c;后面了解到一种注册服务式启动jar包的方式&#xff0c;所以做个记录。 注意&#xff1a;我在写该篇博客的时候&#xff0c;给脚本代码都加了#注释来解释该行脚本命令的意思&#xff0c;所以可能出现复制该篇博客脚本…

gookit/color - Go语言命令行色彩使用库教程

gookit/color - Go语言命令行色彩使用库教程 1.安装2.基础颜色(16-color)3.256色彩/RGB风格 1.安装 go get github.com/gookit/color2.基础颜色(16-color) 提供通用的API方法&#xff1a;Print Printf Println Sprint Sprintf 1、例如&#xff1a; color.Yellow.Println(&q…

Elasticsearch:使用 ELSER v2 文本扩展进行语义搜索

Elastic 提供了一个强大的 ELSER 供我们进行语义搜索。ELSER 是一种稀疏向量的搜索方法。我们无需对它做任何的微调及训练。它是一种 out-of-domain 的模型。目前它仅对英文进行支持。希望将来它能对其它的语言支持的更好。更多关于 ELSER 的知识&#xff0c;请参阅文章 “Elas…

关键字:new关键字

在 Java 中&#xff0c;new关键字用于创建对象实例。它是对象创建的语法糖&#xff0c;用于分配内存空间并调用构造函数来初始化对象。 以下是new关键字的基本语法&#xff1a; 在上述语法中&#xff0c;ObjectType是要创建对象的类名&#xff0c;objectName是对象的引用变量…

Android textview展示富文本内容

今天实现的内容&#xff0c;就是上图的效果&#xff0c;通过Span方式展示图片&#xff0c;需要支持文字颜色改变、加粗。支持style\"color:green; font-weight:bold;\"展示。尤其style标签中的font-size、font-weight是在原生中不被支持的。 所以我们今天需要使用自…

听GPT 讲Rust源代码--compiler(2)

File: rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_codegen_cranelift/build_system/prepare.rs文件的作用是为Cranelift代码生成器构建系统准备依赖项。 具体来说&#xff0c;该文件的主要目标是处理Crane…

HarmonyOS自学-Day3(做个登录功能小案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;登录功能小案例 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 HarmonyOS自学笔记&#xff0c;此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…

信息管理就业方向之产品经理

学长分享自己确定互联网产品经理的工作方向以及产品经理的相关工作情况。 互联网领域产品经理是对一个软件或者平台产品的运维和设计。比如网上订机票业务&#xff0c;需要根据筛选用户的需求&#xff0c;确定要实现的某个需求&#xff0c;然后画出原型图&#xff0c;流程图等…

blender mix节点和它的混合模式

Mix 节点是一种用于混合两个颜色或者两个图像的节点&#xff0c;它有以下几个输入和输出&#xff1a; Color1&#xff1a;用于接收第一个颜色或者图像&#xff0c;也就是基色。Color2&#xff1a;用于接收第二个颜色或者图像&#xff0c;也就是混合色。Fac&#xff1a;用于控制…

一个计算机视觉从业者2023回顾

作为一个计算机视觉从业者&#xff0c;我非常认同上面所列的技术发展规划。在计算机视觉领域&#xff0c;我认为要实现这些规划&#xff0c;需要注重以下几个方面的发展和预测&#xff1a; 深入学习新技术&#xff1a;计算机视觉领域的技术发展非常迅速&#xff0c;不断涌现出新…

原生与封装Ajax

Ajax 一.Ajax概述 1.应用场景 在线视频、直播平台等…评论实时更新、点赞、小礼物、…会员注册时的信息验证&#xff0c;手机号、账号唯一百度关键搜索补全功能 2.简介 Ajax 即“Asynchronous Javascript And XML”&#xff08;异步 JavaScript 和 XML&#xff09;&#x…