IO作业2.0

思维导图

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.mzph.cn/news/592002.shtml

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

相关文章

OpenGL FXAA抗锯齿算法(Qt,Consloe版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前已经提供了使用VCG读取Mesh的方式,接下来就需要针对读取的网格数据进行一些渲染操作了。在绘制Mesh数据时总会遇到图形的抗锯齿问题,OpenGL本身已经为我们提供了一种MSAA技术,但该技术对于一些实时渲染性能有…

计算机组成原理——冯诺依曼计算机硬件框图

存储器&#xff1a;存放数据和程序 运算器&#xff1a;算术运算和逻辑运算 控制器&#xff1a;指挥程序的运算 输入设备&#xff1a;将信息转化成机器能识别的形式 输出设备&#xff1a;将结果转化成人们熟悉的形式

Centos安装Kafka(KRaft模式)

1. KRaft引入 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 由…

使用Apache Commons SCXML实现状态机管理

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们程序员在开发过程中&#xff0c;经常会遇到需要管理不同状态和状态之间转换的场景。比如&#xff0c;一个在线购物的订单&#xff0c;它可能有“新建订单”、“已支付”、“配送中”、“已完成”等状态。在这…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

uniapp运行到开发者工具中

uniapp 项目在微信开发者工具中运行&#xff0c;用于开发微信小程序。 微信 appid 获取地址&#xff1a;微信公众平台 运行到微信开发者工具中 一、进入微信公众平台、微信扫码登录、选择开发管理、选择开发设置、复制 appid 。 二、打开 manifest.json 配置文件、选择微信小…

居家康养领导品牌“颐家”完成B轮融资,商业化进程再加速

近日&#xff0c;颐家&#xff08;上海&#xff09;医疗养老服务有限公司&#xff08;以下称“颐家”“公司”&#xff09;宣布引入战略股东。此次融资额达数千万元人民币&#xff0c;资金将主要用于公司业务数智化升级及自费业务产品开发、团队扩展和业务渠道的开拓。本轮融资…

闭包,垃圾回收机制

1.垃圾回收机制 当函数执行完毕后,函数内部的变量就会被销毁。 代码&#xff1a; function fn() {var a 10;a;return a;}console.log(fn()); 输出的结果: 11 持续调用的结果: 2.变量的私有化 代码: function fn() {var a 10;return function fn1() {return a;}…

Redis——centos7环境安装Redis6.2.14版本,make命令编译时报错:jemalloc/jemalloc.h:没有那个文件或目录

一、报错原因 在redis-6.2.14文件夹下有一个README.md文件&#xff0c;有如下一段话&#xff1a; 在构建 Redis 时&#xff0c;通过设置 MALLOC 环境变量来选择非默认的内存分配器。Redis 默认编译并链接到 libc malloc&#xff0c;但在 Linux 系统上&#xff0c;jemalloc 是…

c语言内嵌汇编知识点记录

内容在飞书云文档&#xff0c;点击打开即可。 Docshttps://r0dhfl3ujy9.feishu.cn/docx/EaVIdjGVeoS6fUxiKWkcjAq8nWg?fromfrom_copylink

2024 Win 安装Oracle12C

文章目录 一、下载1.1 官方下载1.2 官方Archive下载1.3 博主提供 二、安装2.1 解压2.2 安装 三、连接3.1 SQL Plus3.2 切换到容器数据库orclpdb3.3 查询SID 四、查看数据4.1 SQL Develop 连接4.2 创建新用户4.3 develop 直接创建新用户4.3.2 SQL 错误: ORA-65096: 公用用户名或…

STM32CubeMX教程13 ADC - 单通道转换

目录 1、准备材料 2、实验目标 3、ADC概述 4、实验流程 4.0、前提知识 4.1、CubeMX相关配置 4.1.1、时钟树配置 4.1.2、外设参数配置 4.1.3、外设中断配置 4.2、生成代码 4.2.1、外设初始化调用流程 4.2.2、外设中断调用流程 4.2.3、添加其他必要代码 5、常用函数…

堆排序(C语言版)

一.堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 升序&#xff1a;建大堆 降序&#xff1a;建小堆 2. 利用堆删除思想来进行排序 1.1.利用上下调整法实现堆排序 第一步&#xff1a;建堆 好了&#xff0c;每次建堆都要问自己…

MVCC 并发控制原理-源码解析(非常详细)

基础概念 并发事务带来的问题 1&#xff09;脏读&#xff1a;一个事务读取到另一个事务更新但还未提交的数据&#xff0c;如果另一个事务出现回滚或者进一步更新&#xff0c;则会出现问题。 2&#xff09;不可重复读&#xff1a;在一个事务中两次次读取同一个数据时&#xff0c…

【逆向】从逆向角度看C++

从逆向角度看C 1.2.1 虚函数地址表&#xff08;虚表&#xff09; 定义&#xff1a;当类中定义有虚函数时&#xff0c;编译器会把该类中所有虚函数的首地址保存在一张地址表中&#xff0c;即虚函数地址表。虚表信息在编译后被链接到执行文件中&#xff0c;因此所获得的虚表地址…

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中)

文章目录 3D数学基础矢量/向量概述 - 什么是向量单位矢量&#xff1a;只关注方向不关注大小 数学运算矢量的加法与减法减法的几何意义计算一个点到另一个点的位移矢量的点积与叉积 矩阵矩阵的几何意义 3D数学基础 矢量/向量 在笔记中 变量使用小写字母表示&#xff0c;a由于…

Linux实用指令篇

目录结构 Linux文件系统结构是从Unix文件结构演进过来的。在Linux文件系统中&#xff0c;通用的目录名用于表示一些常见的功能。 Linux 的文件系统是采用层级式的树状目录结构&#xff0c;在此结构中的最上层是 根目录 “/”&#xff0c;然后在此目录下再创建其他的目录。在L…

安装 Node.js、npm

安装 nodejs 安装Node.js的最简单的方法是通过软件包管理器。 Node.js官网&#xff1a;https://nodejs.org/en/download/ cd /usr/local/src/wget -c https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz xz -d node-v18.16.0-linux-x64.tar.xz tar -xf node…

轻松搞定软件开发:找对软件开发公司的流程与注意事项!

随着数字化时代的来临&#xff0c;软件开发在企业和个人生活中扮演着越来越重要的角色&#xff0c;然而&#xff0c;如何找到一家合适的软件开发公司却成为了一个令人头疼的问题。 本文将为你详细解读找软件开发公司的流程&#xff0c;以及在选择过程中需要注意的事项&#xf…

C#编程-编写和执行C#程序

编写和执行C#程序 可以使用Windows记事本应用程序来编写C#程序。在记事本应用程序中创建C#程序后,您需要编译并执行该程序以获得所需的输出。编译器将程序的源代码转换为机器代码,这样计算机就能理解程序中的指令了。 注释 除了记事本,您还可以使用任何其他文本编辑器来编写…