2.18:IO fgets、fputs

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 }  

运行结果:

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值