1.使用fgets统计一个文件的行数
程序代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 int main(int argc, const char *argv[])
5 {
6 //使用fgets统计给定文件的行数
7 //判断外部传参
8 if(argc!=2)
9 {
10 printf("input file error\n");
11 printf("usage:./a.out filename\n");
12 return -1;
13 }
14 //定义文件指针,只读打开文件
15 FILE *fp=NULL;
16 if((fp=fopen(argv[1],"r"))==NULL)
17 {
18 perror("fopen error");
19 return -1;
20 }
21 //统计行数
22 int row=0;
23 char buf[5]="";
24 while(1)
25 {
26 char *ptr=fgets(buf,sizeof(buf),fp);
27 if(ptr==NULL)
28 break;
29 //判断最后一个字符为'\n'
30 if(buf[strlen(buf)-1]=='\n')//数组从0开始
31 row++;
32 }
33 //输出行数
34 printf("row=%d\n",row);
35 //关闭文件
36 fclose(fp);
37 return 0;
38 }
运行结果:
2.使用fgets、fputs完成两个文件的拷贝
程序代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 int main(int argc, const char *argv[])
5 {
6 //判断外部传参
7 if(argc!=3)
8 {
9 printf("input file error\n");
10 printf("usage:./a.out srcfile destfile\n");
11 return -1;
12 }
13 //定义文件指针,只读打开文件src
14 FILE *src=NULL;
15 if((src=fopen(argv[1],"r"))==NULL)
16 {
17 perror("fopen error");
18 return -1;
19 }
20 //定义文件指针,只写打开文件dest
21 FILE *dest=NULL;
22 if((dest=fopen(argv[2],"w"))==NULL)
23 {
24 perror("fopen error");
25 return -1;
26 }
27 char buf[5]="";
28 while(1)
29 {
30 char *ptr=fgets(buf,sizeof(buf),src);
31 if(ptr==NULL)//不能用ptr!=NULL,否则跳不出去循环
32 break;
33 fputs(ptr,dest);//将读取的文件放入dest
34 }
35 printf("success\n");
36 //关闭文件
37 fclose(src);
38 fclose(dest);
39 return 0;
40 }
运行结果:
3.完成注册登录功能
功能1是注册功能,输入注册账户和注册密码,将账户和密码写入文件中
功能2是登录功能,提示并输入登录账户和登录密码,并用其遍历文件中的每一组账户和密码,匹配成功,登录成功,否则提示登录失败
程序代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 int registe();
5 int login();
6 int main(int argc, const char *argv[])
7 {
8 int menu=0;
9 while(1)
10 {
11 system("clear");//执行终端指令
12 printf("\t\t=====登录界面=====\n");
13 printf("\t\t=====1.注册=====\n");
14 printf("\t\t=====2.登录=====\n");
15 printf("\t\t=====0.退出=====\n");
16 printf("please enter choose:");
17 scanf("%d",&menu);
18 getchar();
19 //对菜单多分支选择
20 switch(menu)
21 {
22 case 1:
23 {
24 //注册功能
25 registe();
26 }
27 break;
28 case 2:
29 {
30 //登录功能
31 login();
32 }
33 break;
34 case 0:goto END;
35 default:printf("enter error,please renter\n");
36 }
37 //提示输入任意键,按回车结束
38 printf("please enter any_button+Enter over!!!\n");
39 while(getchar()!='\n');
40 }
41 END:
42 return 0;
43 }
44 //注册函数
45 int registe()
46 {
47 //定义文件,以追加形式打开文件
48 FILE *fp_reg=NULL;
49 char acc_reg[20];//账号
50 char pwd_reg[20];//密码
51 //提示输入账号、密码
52 printf("please enter acc_reg:");
53 fgets(acc_reg,sizeof(acc_reg),stdin);
54 //fgets读取sizeof长度,遇到'\n'或文件结束,停止一次读取
55 //因'\n'而结束的会在'\n'后加'\0'
56 //1234'\n''\0'
57 //strlen=5,arr[strlen-1]=arr[4]='\n'(数组下标从0开始),替换成'\0'
58 acc_reg[strlen(acc_reg)-1]='\0';//把结尾的'\n',换成'\0'
59 printf("please enter pwd_reg:");
60 fgets(pwd_reg,sizeof(pwd_reg),stdin);
61 pwd_reg[strlen(pwd_reg)-1]='\0';//把结尾的'\n',换成'\0'
62 //打开文件
63 if((fp_reg=fopen("./usr.txt","a"))==NULL)
64 { perror("fopen error");
65 return -1;
66 }
67 //账号密码写入文件
68 fprintf(fp_reg,"%s %s\n",acc_reg,pwd_reg);
69 //关闭文件
70 fclose(fp_reg);
71 printf("success\n");
72 return 0;
73 }
74 //登录函数
75 int login()
76 {
77 //定义变量存储登录账户、密码
78 char acc_log[20];
79 char pwd_log[20];
80 //提示输入登录账号、密码
81 printf("please enter acc_log:");
82 fgets(acc_log,sizeof(acc_log),stdin);
83 acc_log[strlen(acc_log)-1]='\0';//结尾'\n',换成'\0'
84 printf("please enter pwd_log:");
85 fgets(pwd_log,sizeof(pwd_log),stdin);
86 pwd_log[strlen(pwd_log)-1]='\0';
87 //定义文件,只读形式打开文件
88 FILE *fp_log=NULL;
89 if((fp_log=fopen("./usr.txt","r"))==NULL)
90 {
91 perror("fopen error");
92 return -1;
93 }
94 //定义变量存储循环读取的内容
95 char acc[20]="";
96 char pwd[20]="";
97 //对比注册账户、密码,遍历两个文件内容
98 while(1)
99 {
100 //循环读取登录文件的内容
101 int res=fscanf(fp_log,"%s %s",acc,pwd);
102 //fscanf返回的是读取的个数
103 if(res<0)
104 {
105 printf("fault\n");
106 fclose(fp_log);
107 return -1;
108 }
109 //判断账号密码匹配
110 if(strcmp(acc_log,acc)==0&&strcmp(pwd_log,pwd)==0)
111 {
112 printf("success\n");
113 fclose(fp_log);
114 return 0;
115 }
116
117 }
118 }
运行结果: