IO进程线程作业day1

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
	//判断外部输入文件名是否规范
	if(argc!=2)
	{
		printf("input 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 count=0;//计数器
	char str[100];//获取文件的字符串的搬运工
	while(1)
	{
		char *ptr=fgets(str,sizeof(str),fp);//从fp文件中读取字符串
			if(ptr==NULL)
			{
				break;
			}
			count++;
	}
	printf("文件的行号为%d\n",count);
	fclose(fp);
	return 0;
}

 现象展示:

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{	
	//判断外部输入文件名是否规范
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage:./a.out filename\n");
		return -1;
	}
	FILE *fp=NULL;//定义被获取文件内容的文件指针
	//以只读的形式打开文件fp
	if((fp=fopen(argv[1],"r"))==NULL)
	{
		perror("fopen error");
		return -1;
	}
	FILE *fq=NULL;//定义被输入文件内容的文件指针
	//以只写的形式打开文件fq
	if((fq=fopen(argv[2],"w"))==NULL)
	{
		perror("fopen error");
		return -1;
	}	
	char str[4];//获取文件的字符串的搬运工,每四个字符为一组截取
	while(1)
	{
		char *ptr=fgets(str,sizeof(str),fp);//从fp文件中读取字符串
			if(ptr==NULL)
			{
				break;
			}
			fputs(ptr,fq);
	}
	fclose(fp);
	fclose(fq);
	//以只读的形式打开文件fq
	if((fq=fopen(argv[2],"r"))==NULL)
	{
		perror("fopen error");
		return -1;
	}	
    while(1)
    {
        char *ptr = fgets(str, sizeof(str), fq);   //从fq文件中读取字符串到buf中
        if(ptr == NULL)
        {
            break;
        }
        printf("str=%s\n", str);
    }
	fclose(fq);
	return 0;
}

现象展示:

3> 完成注册登录功能

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
#define Size 50
void register_user();
void login_user();
int main(int argc, const char *argv[])
{
	int number=0;
	FILE *fp = NULL;

    while(1)
	{
		printf("\t\t======XXX登录界面============\n");
		printf("\t\t======1、注册============\n");
		printf("\t\t======2、登录============\n");
		printf("\t\t======0、退出============\n");
		printf("请输入选项:");
		scanf("%d", &number);
		getchar();

		//对菜单多分支选择
		switch(number)
		{
		case 1:
			{
				//注册功能
				register_user();  	
			}
			break;

		case 2:
			{
				//登录功能
				login_user();  	}
			break;

		case 0:
			{
				printf("退出成功");
				goto END;
			}

		default:printf("您输入的功能有误,请重新输入\n");break;
		}
	}
END:
	return 0;
}
void register_user() 
{  
    char username[Size];  
    char password[Size];    
    printf("\n注册新用户:\n");  
    printf("请输入账户名:");  
    scanf("%s", username);   
    printf("请输入密码:");  
    scanf("%s", password);  
    FILE *file = fopen("./user.txt", "a"); //以追加的方式打开文件 
    if (file == NULL) {  
        perror("打开文件失败");  
        return;  
    }    
    fprintf(file, "%s\n", username); //将账号输入进文件中
	fprintf(file,"%s\n",password);//将密码输入进文件中
    fclose(file);  
    printf("注册成功!\n");  
}
void login_user() 
{
    char username[Size];
    char password[Size];
    char file_username[Size];
	char file_password[Size];

    printf("\n登录:\n");
    printf("请输入账户名:");
    scanf("%s", username); //从终端获取账号
    printf("请输入密码:");//从终端获取密码
    scanf("%s", password); 
    FILE *file = fopen("./user.txt", "r");//以只读形式打开文件
    if (file == NULL) 
	{
        perror("打开文件失败");
        return;
    }

    int found = 0;
    while (1) 
	{
		char *p=fgets(file_username,sizeof(file_username),file);
		char *q=fgets(file_password,sizeof(file_password),file);
		file_username[strlen(file_username)-1]='\0';//将账号的字符串字符串的最后一位转为\0,为转化前最后一位是\n
		file_password[strlen(file_password)-1]='\0';
		if(p==NULL || q==NULL)
		{
			break;
		}
		if (strcmp(username, file_username) == 0 && strcmp(password, file_password) == 0)//比较账号和账号是否相等,密码和密码是否相等
		{
			found=1;
			printf("登录成功\n");
			break;
		}
	}

	fclose(file);
	if (found!=1) 
		printf("登录失败,账户或密码错误。\n");

}

现象展示:

思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>