【自制系列】自制文本编辑器(控制台版本) 第三篇

好消息!好消息!新增添加用户的功能了!

 

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);
        }
    }
}

 

【自制系列】自制文本编辑器(控制台版本) 第三篇

上一篇:RabbitMQ和Kafka的区别


下一篇:leetcode-华为专题-103. 二叉树的锯齿形层序遍历