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");
}
现象展示:
思维导图