【自制系列】自制文本编辑器(控制台版本) 第三篇
好消息!好消息!新增添加用户的功能了!
1,print函数:往控制台打印所有的文件内容。
注意:每次print完之后要fclose,否则再次print的时候就不能输出东西了(因为文件读取指针已经到了最后)
2,adduser:添加用户
3,open的时候,fopen的第二个参数应该是a+,这样才能在文件后面追加内容,否则关闭之后,第二次打开就什么都没有了。
代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> //全局变量定义区 struct USER{ char name[100]; int password; }user[10000]; int size=0; char s[100]; struct USER curr_user; int flag=0;//如果当前有用户正在运行标记为1,否则为0 char curr_file[100]; struct FILE *userfile; struct FILE *read; char openfilename[100]; struct FILE* userinfo;//读入用户信息 int user_ptr=0;//当前最大的用户下标 //函数定义区 int check_user(struct USER u){//确认用户名和密码 for(int i=0;i<size;i++){ if((strcmp(u.name,user[i].name)==0) && u.password==user[i].password)return 1; } return 0; } void open_file(const char *username,const char *filename){ char s[100]; sprintf(s,"%s-%s",username,filename);//文件的最前面要加上用户名的标记 userfile=fopen(s,"a+");//打开文件,原本内容保留,因此用a+ read=fopen(s,"r"); strcpy(openfilename,s); } void write_userinfo(void){ userinfo=fopen("userinfo.txt","w"); fprintf(userinfo,"%d\n",user_ptr+1); for(int i=0;i<=user_ptr;i++){ fprintf(userinfo,"%s %d",user[i].name,user[i].password); } fclose(userinfo); } //主程序 int main(void){ userinfo=fopen("userinfo.txt","r"); int i=0; fscanf(userinfo,"%d",&size); for(int i=0;i<size;i++){ fscanf(userinfo,"%s %d",user[i].name,&user[i].password); //printf("%s %d\n",user[i].name,user[i].password); } fclose(userinfo); for(;;){ putchar('>'); scanf("%s",&s); if(strcmp(s,"login")==0){ scanf("%s %d",curr_user.name,&curr_user.password); int i=check_user(curr_user); if(!i)printf("密码错误或用户名错误。\n"); else{ flag=1; } } else if(strcmp(s,"logoff")==0){ flag=0; } else if(strcmp(s,"getuser")==0){ if(flag==0)printf("无用户登录\n"); else printf("%s\n",curr_user.name); } else if(strcmp(s,"open")==0){ scanf("%s",curr_file); if(!flag)printf("还没有登录\n"); else open_file(curr_user.name,curr_file); } else if(strcmp(s,"line")==0){ char st[100]; scanf("%s",st); if(!flag)printf("还没有登录\n"); else fprintf(userfile,"%s\n",st);//新加入一行 } else if(strcmp(s,"close")==0){ if(!flag)printf("还没有登录\n"); else fclose(userfile); } else if(strcmp(s,"clear")==0){ system("cls"); } else if(strcmp(s,"print")==0){ read=fopen(openfilename,"r"); int temp;//EOF为负数,需要用int存储 while((temp=fgetc(read))!=EOF)putchar(temp); fclose(read); } else if(strcmp(s,"adduser")==0){ ++user_ptr; scanf("%s %d",user[user_ptr].name,&user[user_ptr].password); curr_user=user[user_ptr]; flag=1; write_userinfo(); } else{ printf("%s不是可执行的指令。\n",s); } } }