【自制系列】自制文本编辑器(控制台版本) 第二篇
我们准备新加入下面的功能:
1,之前既然有了用户的功能,那么就要这样处理:每个用户只可以访问自己的文件,不可以访问他人的文件
因此,我们可以在文件名之前加上前缀,例如:admin-a.txt
admin-前缀表示这个文件是admin的
因此,代码如下:
userfile和read都是FILE*类型的全局变量,用于存储当前正在打开的文件。
sprintf此处用于连接字符串。(一般我们连接字符串只会想到strcat,其实sprintf也可以)
然后,是open指令,用于进行文件的打开操作。
既然有打开,那么肯定有关闭操作。只需要调用fclose函数即可。
接下来是line指令,用于往文件里面加入一行。
需要注意的是,所有的操作都需要在登录之后才能进行。
全部代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 //全局变量定义区 6 struct USER{ 7 char name[100]; 8 int password; 9 }user[10000]; 10 int size=0; 11 char s[100]; 12 struct USER curr_user; 13 int flag=0;//如果当前有用户正在运行标记为1,否则为0 14 char curr_file[100]; 15 struct FILE *userfile; 16 struct FILE *read; 17 18 19 //函数定义区 20 int check_user(struct USER u){//确认用户名和密码 21 for(int i=0;i<size;i++){ 22 if((strcmp(u.name,user[i].name)==0) && u.password==user[i].password)return 1; 23 } 24 return 0; 25 } 26 void open_file(const char *username,const char *filename){ 27 char s[100]; 28 sprintf(s,"%s-%s",username,filename);//文件的最前面要加上用户名的标记 29 userfile=fopen(s,"w+");//打开文件 30 read=fopen(s,"r"); 31 } 32 33 34 //主程序 35 int main(void){ 36 struct FILE* userinfo;//读入用户信息 37 userinfo=fopen("userinfo.txt","r"); 38 int i=0; 39 fscanf(userinfo,"%d",&size); 40 for(int i=0;i<size;i++){ 41 fscanf(userinfo,"%s %d",user[i].name,&user[i].password); 42 //printf("%s %d\n",user[i].name,user[i].password); 43 } 44 fclose(userinfo); 45 46 for(;;){ 47 putchar('>'); 48 scanf("%s",&s); 49 if(strcmp(s,"login")==0){ 50 scanf("%s %d",curr_user.name,&curr_user.password); 51 int i=check_user(curr_user); 52 if(!i)printf("密码错误或用户名错误。\n"); 53 else{ 54 flag=1; 55 } 56 } 57 else if(strcmp(s,"logoff")==0){ 58 flag=0; 59 } 60 else if(strcmp(s,"getuser")==0){ 61 if(flag==0)printf("无用户登录\n"); 62 else printf("%s\n",curr_user.name); 63 } 64 else if(strcmp(s,"open")==0){ 65 scanf("%s",curr_file); 66 if(!flag)printf("还没有登录\n"); 67 else open_file(curr_user.name,curr_file); 68 } 69 else if(strcmp(s,"line")==0){ 70 char st[100]; 71 scanf("%s",st); 72 if(!flag)printf("还没有登录\n"); 73 else fprintf(userfile,"%s\n",st);//新加入一行 74 } 75 else if(strcmp(s,"close")==0){ 76 if(!flag)printf("还没有登录\n"); 77 else fclose(userfile); 78 } 79 else if(strcmp(s,"clear")==0){ 80 system("cls"); 81 } 82 else{ 83 printf("%s不是可执行的指令。\n",s); 84 } 85 } 86 }
完。