IO进程线程day1作业

1、使用fgets统计给定文件行数

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
	if(argc != 2)
	{
		printf("inputs file error\n");
		printf("usage:./a.out filename\n");
		return -1;
	}

	//定义文件指针,以只读形式打开文件
	FILE *fp = NULL;
	if((fp = fopen(argv[1],"r")) == NULL)
	{
		perror("fopen error");
		return -1;
	}
	int line=0;
	char buf[5]="";
	while(1)
	{
		char *ptr=fgets(buf,sizeof(buf),fp);
		if(ptr==NULL)
		{
			break;
		}
		while(*ptr!='\0')
		{
			if(*ptr=='\n')
			{
				line++;
			}
			ptr++;
		}
	}
	printf("line=%d\n",line);

	//关闭文件
	fclose(fp);
	return 0;
}

运行结果:

2、使用fputs和fgets完成两个文件的拷贝

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
	if(argc != 3)
	{
		printf("inputs file error\n");
		printf("usage:./a.out srcfile destfile\n");
		return -1;
	}
	//定义文件指针,以只读形式打开文件
	FILE *srcfp = NULL;
	if((srcfp = fopen(argv[1],"r")) == NULL)
	{
		perror("fopen error");
		return -1;
	}
	//定义文件指针,以只写形式打开文件
	FILE *destfp = NULL;
	if((destfp = fopen(argv[2],"w")) == NULL)
	{
		perror("fopen error");
		return -1;
	}
	char buf[10]="";
	while(1)
	{
		char *ptr=fgets(buf,sizeof(buf),srcfp);
		if(ptr==NULL)
		{
			break;
		}
		fputs(ptr,destfp);
	}

	//关闭文件
	fclose(srcfp);
	fclose(destfp);

	return 0;
}

运行结果: 

3、完成注册登录功能

做个小菜单,功能1是注册功能,输入注册账户和注册密码,将账户和密码写入文件中

功能2是登录功能,提示并输入登录账户和登录密码,并用其遍历文件中的每一组账户和密码,如果匹配成功,则登录成功,如果全部不匹配则提示登录失败

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
	int menu=0;
	while(1)
	{
	//	system("clear");  //执行终端指令
		
		printf("************xx登录界面*********************\n");
		printf("**************1->注册**********************\n");
		printf("**************2->登录**********************\n");
		printf("**************3->退出**********************\n");
		printf("请输入选项:");
		scanf("%d",&menu);
		getchar();

		//菜单多分支选择
		switch(menu)
		{
			case 1:
				{
					//注册功能
					//存储账号
					FILE *accountfp=NULL;
					if((accountfp=fopen("./account.txt","a"))==NULL)
					{
						perror("fopen error");
						return -1;
					}
					//定义要写入的用户名账号并存储
					char account[10]="";
					printf("please enter account:");
					fscanf(stdin,"%s",account);
					getchar();
					fputs(account,accountfp);
				//	fputc('\n',accountfp);
					fclose(accountfp);

					//存储密码
					FILE *passwdfp=NULL;
					if((passwdfp=fopen("./passwd.txt","a"))==NULL)
					{
						perror("fopen error");
						return -1;
					}
					//定义要写入的用户名密码并存储
					char passwd[10]="";
					printf("please enter passwd:");
					fscanf(stdin,"%s",passwd);
					getchar();
					fputs(passwd,passwdfp);
				//	fputc('\n',passwdfp);
					fclose(passwdfp);
				//	system("clear");  //执行终端指令
				}break;
			case 2:
				{
					//登录功能
					char buf[10]="";
					//验证账户
					char account[10]="";
					FILE *accountfp=NULL;
					if((accountfp=fopen("./account.txt","r"))==NULL)
					{
						perror("fopen error");
						return -1;
					}
					printf("please enter account:");
					fscanf(stdin,"%s",account);
					while(1)
					{
						//遍历文件中的账户比较
						char *ptr=fgets(buf,sizeof(buf),accountfp);
						if(strcmp(buf,account)==0)
						{
							printf("account true!\n");
							break;
						}
						if(ptr==NULL)
						{
							printf("account error\n");
							goto AERROR;
							break;
						}
					}
					fclose(accountfp);
					
					//验证密码
					char passwd[10]="";
					FILE *passwdfp=NULL;
					if((passwdfp=fopen("./passwd.txt","r"))==NULL)
					{
						perror("fopen error");
						return -1;
					}
					printf("please enter passwd:");
					fscanf(stdin,"%s",passwd);
					while(1)
					{
						//遍历文件中的账户比较
						char *ptr=fgets(buf,sizeof(buf),passwdfp);
						if(strcmp(buf,passwd)==0)
						{
							printf("passwd true!\n");
							printf("登录成功!\n");
							break;
						}
						if(ptr==NULL)
						{
							printf("passwd error\n");
							printf("登录失败\n");
							break;
						}
					}
					fclose(passwdfp);


				}break;
			case 0:goto END;
			default:printf("error,please try again\n");
		}
		//提示输入任意键按回车结束
		printf("请输入任意键按回车结束!!!\n");
		while(getchar()!='\n');

	}
AERROR:printf("登录失败\n");
END:

	return 0;
}

运行结果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【plt.bar绘制条形图or柱状图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.bar绘制条形图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib】 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f50d; 一、初识plt.bar&#xff1a;条形图的基本概念&#x1f4a1; 二、plt.…

6.s081 学习实验记录(六)copy on write fork

文章目录 实现COW一、问题二、注意三、实现COW四、实验结果 实现COW 一、问题 准备&#xff1a;切换到 cow 分支 目前 xv6 的 fork 系统调用创建的子进程会赋值父进程所有的用户态内存&#xff0c;如果父进程比较大&#xff0c;那么这个复制过程会很耗时&#xff0c;而且一般…

java根据前端所要格式返回树形3级层级数据

一、业务分析&#xff0c;根据前端需求返回如下数据格式 二、后端设计数据类型VO /*** author TTc* version 1.0* date 2024/2/15 16:47*/ Data AllArgsConstructor NoArgsConstructor public class Catalog2Vo {/*** 一级父分类的 id*/private String catalog1Id;/*** 三级子…

ForkJoin 的使用以及原理

原理 Fork-Join 是一种并行计算模式&#xff0c;它通常用于解决递归式或者分治式的问题。其原理基于将一个大的任务划分成若干个小任务&#xff0c;然后并行地执行这些小任务&#xff0c;最后将它们的结果合并起来得到最终的结果。 具体来说&#xff0c;Fork-Join 模式包含两个…

RK3399平台开发系列讲解(USB篇)U盘等存储类设备

🚀返回专栏总目录 文章目录 一、什么是U盘等存储类设备二、U盘设备传输数据结构三、U盘识别需要打开的宏沉淀、分享、成长,让自己和他人都能有所收获!😄 📢介绍U盘等存储类设备。 一、什么是U盘等存储类设备 USB Mass Storage Device Class(USB MSC/UMS) USB大容量存…

分享几个丝滑oled代码

最近一段业余时间在捣鼓esp32&#xff0c;发现对于一个搞diy的来说&#xff0c;它的生态&#xff0c;不管是开发环境、氛围还是可玩度都是独一挡的&#xff0c;国内外基于此的扩展真是太多了&#xff0c;找了几个通过按键/旋钮进行0.96寸OLED控制的案例&#xff0c;超级丝滑&am…

芯品荟|吉他屏驱应用介绍

PART ONE 市场简介 - Market Profile - 古典吉他与小提琴、钢琴并列为世界著名三大乐器。 目前&#xff0c;带屏成为吉他产品的新发展趋势。 核心应用 调音器、节拍器、录音器、效果、练习、循环乐段。 特色应用 4.3寸以下TFT屏 分辨率800*480以下 不带音弦按键替代&…

鸿蒙OS跨进程IPC与RPC通信

一、IPC与RPC通信概述 基本概念 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动…

对称密钥的分配、公钥的分配

目录 密钥分配 1 对称密钥的分配 KDC 对会话密钥 KAB 的分配 对称密钥分配协议&#xff1a;Kerberos 2 公钥的分配 认证中心 CA (Certification Authority) 数字证书 (digital certificate) 已签名的 B 的数字证书的产生过程 X.509 数字证书 认证系统 证书链 证书…

智慧农业一体化平台概述

智慧农业是以物联网为基础,以信息化技术为支撑通过对于科研、生产、物流、销售的各个农业生产环节的信息化管理,实现科学指导、高效生产、科学预测、精准销售、数据决策。因此,构建智慧农业一体化平台,完成对于农业科技管理、农业生产过程管理、农产品物流与商贸管理,从而…

记一个js原生 日期 时间 处理 格式化 对象 Intl 方法

具体对应搜搜。听说用空格分开能增加关键词搜到的概率 说起来最近好像越来越懒了

Quartz---基础

1.概述 Quartz是一个完全由Java编写的开源任务调度框架&#xff0c;通过触发器来设置作业定时运行规则&#xff0c;控制作业的运行时间。Quartz框架的主要核心组件包括调度器、触发器和作业。调度器作为作业的总指挥&#xff0c;触发器作为作业的操作者&#xff0c;而作业则为应…

有关光猫、路由器、交换机、网关的理解

前提 在了解计算机网络的过程中&#xff0c;出现了这四个名词&#xff1a;光猫、路由器、交换机、网络。有点模糊&#xff0c;查阅互联网相关资料&#xff0c;进行整理。如有错误&#xff0c;欢迎大家批评指正。 光猫 首先光猫是物理存在的&#xff0c;大家在家里应该都可以…

代码随想录day25--回溯的应用4

LeetCode491.非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;…

AI生图软件:让创意无限飞扬

随着科技的飞速发展&#xff0c;人工智能(AI)已经逐渐渗透到我们的日常生活之中&#xff0c;其中包括图像编辑。AI生图软件就是这样一种应用了AI技术的创新产品&#xff0c;它正在改变着图像编辑的方式&#xff0c;让我们能够以前所未有的方式创作和分享视觉内容。 一、什么是A…

300分钟吃透分布式缓存-01讲:业务数据访问性能太低怎么办?

这节课主要讲缓存的基本思想、缓存的优点、缓存的代价三个部分。 缓存的定义 先来看下缓存的定义。 & 缓存最初的含义&#xff0c;是指用于加速 CPU 数据交换的 RAM&#xff0c;即随机存取存储器&#xff0c;通常这种存储器使用更昂贵但快速的静态 RAM&#xff08;SRAM&…

七、Mybatis缓存

缓存就是内存中的数据&#xff0c;常常来自对数据库查询结果的保存&#xff0c;使用缓存、可以避免频繁的与数据库进行交互&#xff0c;进而提高响应速度一级缓存是sqlSession级别的缓存&#xff0c;在操作数据库时需要构造sqlsession对象&#xff0c;在对象中有一个数据结构&a…

前端技巧之svg精灵图svg-sprite-loader

首先说明精灵图的必要性&#xff0c;其可以让我们只需要向服务器请求一次图片资源&#xff0c;就能加载很多图片&#xff0c;即能够减轻http请求造成的服务器压力。 然后这里要说明的是这个插件是webpack上面的&#xff0c;所以在vue2中比较好用&#xff0c;如果在vue3中&…

C语言—字符数组(3)

可能不是那么的完整&#xff0c;先凑合看吧&#xff0c;如果我学会如何修改以后&#xff0c;我慢慢回来修改的 1.编写程序实现对两个字符串的连接功能&#xff1b; 法一:不使用strcat函数,写程序直接实现&#xff0c;记得添加结束符&#xff0c;不然程序访问数组时候将变得不…

Vue路由

Vue路由 一、路由的基本使用二、组件的存放目录问题三、路由的封装抽离四、声明式导航-导航链接五、声明式导航-查询参数传参六、Vue路由-重定向七、编程式导航-两种路由跳转方式八、编程式导航-两种路径跳转传参九、多级路由十、缓存组件 一、路由的基本使用 1.目标 认识插件…
最新文章