当前位置: 首页 > news >正文

【PTA主观题】8-1 文件操作

题目要求

  1. 编写函数int input(FILE * fp),录入学生的信息,自定义录入结束方式,但至少包括学号、姓名、班级、分数和登录密码,并按照学号排序后以二进制方式存入stus.dat,函数返回学生数量;
  2. 定义函数void encrypt(char * file_plain, char * file_cipher),用于加密stus.dat的密码字段,其中file_cipher为密文文件标识,file_plain为明文文件标识,加密算法采用与密码进行异或的方式;
  3. 定义函数void decrypt(char * file_cipher, char * file_plain)解密文件;
  4. 定义函数 void show(char * file) 输出文件内容。

将以上几步代码粘贴到报告,并附上运行成功的截图。
注意代码风格和添加充足注释。

代码呈现
 

//C语言
#include<stdio.h>
#include <stdlib.h>
#include <string.h>#define SIZE 100
//定义一个名为Student的结构体,用于存储学生信息。
typedef struct student 
{char id[SIZE];char name[SIZE];char class[SIZE];int score;char password[SIZE];
} Student;//排序函数
void bubbleSort(Student* stu_list, int num)
{int i, j;Student temp;for (i = 0; i < num - 1; i++){for (j = 0; j < num - i - 1; j++){if (strcmp(stu_list[j].id, stu_list[j + 1].id) > 0){// 交换两个学生信息temp = stu_list[j];stu_list[j] = stu_list[j + 1];stu_list[j + 1] = temp;}}}
}//输入
int input(FILE* fp) 
{Student stu_list[SIZE];//结构体数据 便于排序Student stu;int num = 0;char end[4] = "end";//输入结束标志char buffer[SIZE];while (1){printf("Enter student information (id, name, class, score, password):\n");fgets(buffer, SIZE, stdin);//从标准输入(stdin)中读取一行字符串并存储到指定的字符数组(buffer)中//fgets:从标准输入中逐行读取字符,直到遇到换行符(包括换行符在内)。//它会将读取的字符存储到指定的字符数组中,并自动在字符串末尾添加一个空字符('\0')表示字符串的结束。if (strncmp(buffer, end, 3) == 0) //检查是否输入了结束标志,如果 buffer 的前3个字符与 end 的前3个字符完全相等,breakbreak; sscanf(buffer, "%s %s %s %d %s", stu_list[num].id, stu_list[num].name, stu_list[num].class, &stu_list[num].score, stu_list[num].password);//sscanf:从指定的字符串中读取数据并按照指定的格式进行解析//从buffer中按照格式化字符串解析出一个字符串,存储到stu.id中//忽略一个或多个空格字符(以此类推)num++;}// 按学号排序bubbleSort(stu_list, num);// 写入二进制文件fwrite(stu_list, sizeof(Student), num, fp);//fwrite:将结构体对象stu写入文件中。//size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);//ptr:要写入数据的内存地址。buffer(数组名相当于地址)//size:每个元素的大小(以字节为单位)。sizeof(Student)//count:要写入的元素数量。1//stream:指向要写入数据的文件流。,fpreturn num;
}
void encrypt(char* file_plain, char* file_cipher) 
{FILE* fp1, * fp2;Student stu;int i;fp1 = fopen(file_plain, "rb");fp2 = fopen(file_cipher, "wb");//FILE *fopen(const char *filename, const char *mode);返回值://如果文件成功打开,则返回一个指向 FILE 类型结构的指针,该指针用于后续对文件进行读写操作。//如果文件打开失败,则返回 NULL。//filename:表示要打开的文件名或文件路径的字符串。//mode:表示打开文件的模式的字符串。模式字符串可以是以下值之一(常见的模式):// "r"	只读模式(文件必须存在)//"w"	写入模式(如果文件存在则截断,不存在则创建)//"a"	追加模式(如果文件存在则在末尾追加,不存在则创建)//"rb"	二进制只读模式//"wb"	二进制写入模式//"ab"	二进制追加模式while (fread(&stu, sizeof(Student), 1, fp1)){//对于每个读取到的结构体,循环遍历其password成员中的每个字符,并对其进行异或加密操作for (i = 0; i < strlen(stu.password); i++){stu.password[i] ^= 7; //(使用异或运算符^和常数7)然后将加密后的结构体写入fp2指向的文件中。}fwrite(&stu, sizeof(Student), 1, fp2);}//关闭文件指针fp1和fp2fclose(fp1);fclose(fp2);
}void decrypt(char* file_cipher, char* file_plain)
{FILE* fp1, * fp2;Student stu;int i;fp1 = fopen(file_cipher, "rb");fp2 = fopen(file_plain, "wb");while (fread(&stu, sizeof(Student), 1, fp1)){for (i = 0; i < strlen(stu.password); i++){stu.password[i] ^= 7; // 与密码进行异或解密}fwrite(&stu, sizeof(Student), 1, fp2);}fclose(fp1);fclose(fp2);//int fclose(FILE *stream);// stream 是一个指向 FILE 类型结构的指针,该指针是由 fopen 函数返回的。//如果关闭成功,则返回 0;否则,返回一个非零值。}void show(char* file) {FILE* fp;Student stu;fp = fopen(file, "rb");while (fread(&stu, sizeof(Student), 1, fp) == 1) {printf("ID: %s\n", stu.id);printf("Name: %s\n", stu.name);printf("Class: %s\n", stu.class);printf("Score: %d\n", stu.score);printf("Password: %s\n", stu.password);printf("--------------------\n");}fclose(fp);
}int main() 
{FILE* fp;int num;char file_plain[] = "stus.dat";char file_cipher[] = "stus_cipher.dat";// 输入学生信息并存储到二进制文件中fp = fopen(file_plain, "wb");num = input(fp);fclose(fp);// 对密码字段进行加密encrypt(file_plain, file_cipher);// 输出加密后的文件内容printf("Encrypted file content:\n");show(file_cipher);// 对加密后的文件进行解密decrypt(file_cipher, file_plain);// 输出解密后的文件内容printf("\nDecrypted file content:\n");show(file_plain);return 0;
}

相关文章:

【PTA主观题】8-1 文件操作

题目要求 编写函数int input(FILE * fp)&#xff0c;录入学生的信息&#xff0c;自定义录入结束方式&#xff0c;但至少包括学号、姓名、班级、分数和登录密码&#xff0c;并按照学号排序后以二进制方式存入stus.dat&#xff0c;函数返回学生数量&#xff1b;定义函数void enc…...

机器学习算法决策树

决策树的介绍 决策树是一种常见的分类模型&#xff0c;在金融风控、医疗辅助诊断等诸多行业具有较为广泛的应用。决策树的核心思想是基于树结构对数据进行划分&#xff0c;这种思想是人类处理问题时的本能方法。例如在婚恋市场中&#xff0c;女方通常会先询问男方是否有房产&a…...

ssh和sftp服务分离

目录 一、增加sftp的deamon二、增加sftp的service三、其他配套文件四、修改配置文件五、分别重启两个服务&#xff1a; 由于安全需要&#xff0c;客户这边想把sftp使用的端口与ssh使用的端口分开。 我们知道sftp没有自己的服务器守护进程&#xff0c;它需要依赖sshd守护进程来…...

Bootstrap学习三

Bootstrap学习三 文章目录 前言四、Bootstrap插件4.1. 插件概览4.1.1. data属性4.1.2. 编程方式的API4.1.3. 避免命名空间冲突4.1.4. 事件 4.2. 模态框4.2.1. 引入4.2.2. 基本结构4.2.3. 基本使用4.2.4. 触发模态框的方法 4.3. 下拉菜单和滚动监听4.3.1. 下拉菜单4.3.2. 滚动监…...

第77讲用户管理功能实现

用户管理功能实现 前端&#xff1a; views/user/index.vue <template><el-card><el-row :gutter"20" class"header"><el-col :span"7"><el-input placeholder"请输入用户昵称..." clearable v-model"…...

锐捷(十九)锐捷设备的接入安全

1、PC1的IP地址和mac地址做全局静态ARP绑定; 全局下&#xff1a;address-bind 192.168.1.1 mac&#xff08;pc1&#xff09; G0/2:ip verify source port-securityarp-check 2、PC2的IP地址和MAC地址做全局IPMAC绑定&#xff1a; Address-bind 192.168.1.2 0050.7966.6807Ad…...

【MySQL题】——基础概念论述(二)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…...

Spring Boot + flowable 快速实现工作流

背景 使用flowable自带的flowable-ui制作流程图 使用springboot开发流程使用的接口完成流程的业务功能 文章来源&#xff1a;https://blog.csdn.net/zhan107876/article/details/120815560 一、flowable-ui部署运行 flowable-6.6.0 运行 官方demo 参考文档&#xff1a; htt…...

(已解决)LaTeX Error: File `svproc.cls‘ not found. (用Springer LNCS 会议Proceedings模板)

会议要求使用LNCS模板&#xff0c;并给了获取模板链接&#xff1a;https://www.springer.com/gp/authors-editors/conference-proceedings/conference-proceedings-guidelines。我在里面下载了latex模板之后&#xff0c;编译那个author.tex发现抱错&#xff1a; 解决办法&#…...

Spring Boot 自定义指标

Spring Boot 自定义指标 阅读本文需要对一些前置技术有所了解,下面列出的一些前置技术是必须要了解的。 Prometheus:这是一个时序数据库,我们的指标数据一般保存在这个数据库中。Grafana:借助Grafana可以将Prometheus中的数据以图表的方式展示出来。Micrometer:是一个用于…...

安全的接口访问策略

渗透测试 一、Token与签名 一般客户端和服务端的设计过程中&#xff0c;大部分分为有状态和无状态接口。 一般用户登录状态下&#xff0c;判断用户是否有权限或者能否请求接口&#xff0c;都是根据用户登录成功后&#xff0c;服务端授予的token进行控制的。 但并不是说有了tok…...

最佳视频转换器软件:2024年视频格式转换的选择

我们生活在一个充满数字视频的世界&#xff0c;但提供的内容远不止您最喜欢的流媒体服务目录。虽然我们深受喜爱的设备在播放各种自制和下载的视频文件方面变得越来越好&#xff0c;但在很多情况下您都需要从一种格式转换为另一种格式。 经过大量测试&#xff0c; 我们尝试过…...

深入理解 Nginx 插件及功能优化指南

深入理解 Nginx 插件及功能优化指南 深入理解 Nginx 插件及功能优化指南1. Nginx 插件介绍1.1 HTTP 模块插件ngx_http_rewrite_modulengx_http_access_module 1.2 过滤器插件ngx_http_gzip_modulengx_http_ssl_module 1.3 负载均衡插件ngx_http_upstream_modulengx_http_upstre…...

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Blank组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Blank组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Blank组件 空白填充组件&#xff0c;在容器主轴方向上&#xff0c;空白填充组件具…...

InternLM大模型实战-4.XTuner大模型低成本微调实战

文章目录 前言笔记正文XTuner支持模型和数据集 微调原理跟随文档学习快速上手自定义微调准备数据准备配置文件 MS-Agent微调 前言 本文是对于InternLM全链路开源体系系列课程的学习笔记。【XTuner 大模型单卡低成本微调实战】 https://www.bilibili.com/video/BV1yK4y1B75J/?…...

【SpringBoot篇】解决Redis分布式锁的 误删问题 和 原子性问题

文章目录 &#x1f354;Redis的分布式锁&#x1f6f8;误删问题&#x1f388;解决方法&#x1f50e;代码实现 &#x1f6f8;原子性问题&#x1f339;Lua脚本 ⭐利用Java代码调用Lua脚本改造分布式锁&#x1f50e;代码实现 &#x1f354;Redis的分布式锁 Redis的分布式锁是通过利…...

蓝桥杯Web应用开发-CSS3 新特性【练习三:文本阴影】

文本阴影 text-shadow 属性 给文本内容添加阴影的效果。 文本阴影的语法格式如下&#xff1a; text-shadow: x-offset y-offset blur color;• x-offset 是沿 x 轴方向的偏移距离&#xff0c;允许负值&#xff0c;必须参数。 • y-offset 是沿 y 轴方向的偏移距离&#xff0c…...

LRU缓存

有人从网络读数据&#xff0c;有人从磁盘读数据&#xff0c;机智的人懂得合理利用缓存加速数据的读取效率&#xff0c;提升程序的性能&#xff0c;搏得上司的赏识&#xff0c;赢得白富美的青睐&#xff0c;进一步走向人生巅峰~ LRU假说 LRU缓存&#xff08;Least Recently Used…...

ncc匹配提速总结

我们ncc最原始的匹配方法是&#xff1a;学习模板w*h个像素都要带入ncc公式计算 第一种提速&#xff0c;学习模板是w*h&#xff0c;而我们支取其中的w/2*h/2,匹配窗口同理&#xff0c;计算量只有1/4。 另外一种因为ncc是线性匹配&#xff0c;我们在这上面也做了文章&#xff0…...

人力资源智能化管理项目(day06:员工管理)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 页面结构 <template><div class"container"><div class"app-container"><div class"left"><el-input style&qu…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...