📄 puser.c
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#define MAXUSER 1000#define ROWS 15#define ROW 5#define INROW 22#define ERRROW 23#define NITEM 5struct users{ int no; int job; char code[5]; char name[10]; char pw[20];}usr[MAXUSER];int nusr;int order[MAXUSER];int delf[MAXUSER]; int col[NITEM]={10,20,30,40,52};struct jobs{ int no; char name[10]; char desc[21]; char exec[80];}*job;int njob;char *tab[]={ "工 作 人 员 管 理", "----------------------------------------" "---------------------------------------", "Q-退出 N-指定 A-添加 M-修改 D-删除 U-恢复 S-保存 R-排序"};char *title[]={"编号","职务","编码","姓名","口令"};char UNo[20],RP[80];enum Key{ NONE,Up,Down,Right,Left,Center,End,PgDn,Home, PgUp,Ins,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12};main(int argc,char *argv[]){ char c; int flag=0; int quit; int susr,pusr; int n; if(argc!=3) { printf("Usage: puser user <ROOT PATH>\n"); return 0; } else { strcpy(UNo,argv[1]); strcpy(RP,argv[2]); } init(); if((njob=readjob())==-1) quit=1; else { quit=0; if((nusr=readusr())==-1) nusr=0; susr=0; pusr=0; } while(quit==0) { show(susr,pusr); move(ROW+ROWS+1,41+strlen(tab[2])/2); refresh(); c=getkey(); clrin(); clrerr(); if(c>='A'&&c<='Z') c=c-'A'+'a'; switch(c) { case -1: break; case Down: if(pusr<nusr-1) pusr++; if(pusr-susr>=ROWS) susr++; break; case Up: if(pusr>0) pusr--; if(pusr<susr&&susr>0) susr--; break; case PgUp: if(susr>=ROWS) susr-=ROWS; else susr=0; if(pusr>=ROWS) pusr-=ROWS; else pusr=0; break; case PgDn: if(susr<nusr-ROWS) susr+=ROWS; if(pusr<nusr-ROWS) pusr+=ROWS; else pusr=nusr-1; break; case Home: susr=0; pusr=0; break; case End: if(nusr%ROWS==0) susr=nusr-ROWS; else susr=nusr-nusr%ROWS; pusr=nusr-1; break; case 'n': n=appoint(); if(n<nusr&&n>=0) { susr=n; pusr=n; } break; case 'a': if((n=append())!=-1) flag=1; if(nusr%ROWS==0) susr=nusr-ROWS; else susr=nusr-nusr%ROWS; pusr=nusr-1; break; case 'm': if(modify(susr,pusr)==0) flag=1; break; case 'd': if(delete(pusr)==0) { mvaddch(ROW+pusr-susr,col[0]-1,'*'); refresh(); flag=1; } break; case 'u': if(undelete(pusr)==0) { mvaddch(ROW+pusr-susr,col[0]-1,' '); refresh(); } break; case 's': if(save()==0) flag=0; break; case 'r': sort(); break; case 'q': if(flag==0) quit=1; else if(save()==0) quit=1; else if(yn("fail to save, quit(y/n)? ")==0) quit=1; break; default: printf("\07"); break; } } clear(); refresh(); endwin();}init(){ int i; signal(SIGINT,SIG_IGN); initscr(); raw(); nonl(); noecho(); clear(); mvaddstr(ROW-4,40-strlen(tab[0])/2,tab[0]); for(i=0;i<NITEM;i++) mvaddstr(ROW-2,col[i],title[i]); mvaddstr(ROW-1,0,tab[1]); mvaddstr(ROW+ROWS,0,tab[1]); mvaddstr(ROW+ROWS+1,40-strlen(tab[2])/2,tab[2]); refresh();}int readjob(){ char fn[80]; char errs[128]; int fd; long size; sprintf(fn,"%s/bas/job.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showerr(errs); return 0; } size=lseek(fd,0L,2); job=(struct jobs *)malloc(size); if(job==NULL) { showerr("Fail to alloc memory!"); return -1; } lseek(fd,0L,0); read(fd,(char *)job,size); close(fd); return size/sizeof(struct jobs);}int readusr(){ char fn[80]; char errs[128]; int fd; long size; int i,nusr; sprintf(fn,"%s/bas/user.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showerr(errs); return 0; } else { size=lseek(fd,0L,2); if(size>MAXUSER*sizeof(struct users)) size=MAXUSER*sizeof(struct users); lseek(fd,0L,0); read(fd,(char *)usr,size); close(fd); nusr=size/sizeof(struct users); for(i=0;i<nusr;i++) order[i]=i, delf[i]=0; return nusr; }}sort(){ int i,j,k,n; k=nusr/2; while(k>0) { for(j=k;j<nusr;j++) { n=order[j]; i=j-k; while(i>=0&&usr[order[i]].no>usr[n].no) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; }}int append(){ int i,j,n; int no,jobno; char code[5],name[10],pw[20]; int susr,pusr; susr=nusr-nusr%ROWS; i=0; while(1) { nusr++; if(nusr>=MAXUSER) { showerr("空间已满, 不能再增加!"); break; } pusr=nusr-1; order[pusr]=pusr; if(nusr>1) no=usr[order[pusr-1]].no+1; else no=0; jobno=job[0].no; code[0]='\0'; name[0]='\0'; pw[0]='\0'; n=order[pusr]; usr[n].no=no; usr[n].job=jobno; usr[n].code[0]='\0'; usr[n].name[0]='\0'; usr[n].pw[0]='\0'; if(pusr-susr>=ROWS) susr++; show(susr,pusr); while(1) { if((n=get_n(pusr-susr+ROW,col[0],"",&no,5))==-1) break; else { for(j=0;j<nusr;j++) if(no==usr[j].no&&j!=order[pusr]) break; if(j<nusr) showerr("此人员编号有重复!"); else break; } } if(n==-1) break; while(1) { if((n=get_n(pusr-susr+ROW,col[1],"",&jobno,5))==-1) break; for(j=0;j<njob&&jobno!=job[j].no;j++) ; if(j>=njob) showerr("此职务编号不正确!"); else break; } if(n==-1) break; else { mvaddstr(pusr-susr+ROW,col[1],job[j].name); refresh(); } while(1) { if((n=get_s(pusr-susr+ROW,col[2],"",code,5))==-1) break; else { for(j=0;j<nusr;j++) if(strcmp(code,usr[j].code)==0) break; if(j<nusr) showerr("此人员代码有重复!"); else break; } } if(n==-1) break; if(get_s(pusr-susr+ROW,col[3],"",name,10)==-1) break; if(get_s(pusr-susr+ROW,col[4],"",pw,20)==-1) break; n=order[pusr]; usr[n].no=no; usr[n].job=jobno; strcpy(usr[n].code,code); strcpy(usr[n].name,name); strcpy(usr[n].pw,pw); i++; } nusr--; move(pusr-susr+ROW,0); clrtoeol(); refresh(); if(i>0) return i; else return -1;}int modify(int susr,int pusr){ int i,j,n; int no,jobno; char code[5],name[10],pw[20]; no=usr[order[pusr]].no; while(1) { if((n=get_n(pusr-susr+ROW,col[0],"",&no,5))==-1) break; else { for(j=0;j<nusr;j++) if(no==usr[j].no&&order[pusr]!=j) break; if(j<nusr) showerr("此人员编号有重复!"); else break; } } if(n==-1) return -1; jobno=usr[order[pusr]].job; while(1) { if((n=get_n(pusr-susr+ROW,col[1],"",&jobno,5))==-1) break; for(i=0;i<njob&&jobno!=job[i].no;i++) ; if(i>=njob) showerr("此职务编号不正确!"); else break; } if(n==-1) return -1; else { mvaddstr(pusr-susr+ROW,col[1],job[i].name); refresh(); } strcpy(code,usr[order[pusr]].code); while(1) { if(get_s(pusr-susr+ROW,col[2],"",code,5)==-1) return -1; for(j=0;j<nusr;j++) if(strcmp(code,usr[j].code)==0&&j!=order[pusr]) break; if(j<nusr) showerr("此人员代码有重复!"); else break; } strcpy(name,usr[order[pusr]].name); if(get_s(pusr-susr+ROW,col[3],"",name,10)==-1) return -1; strcpy(pw,usr[order[pusr]].pw); if(get_s(pusr-susr+ROW,col[4],"",pw,20)==-1) return -1; usr[order[pusr]].no=no; usr[order[pusr]].job=jobno; strcpy(usr[order[pusr]].code,code); strcpy(usr[order[pusr]].name,name); strcpy(usr[order[pusr]].pw,pw); return 0;}int delete(int pusr){ delf[order[pusr]]=1; return 0;}int undelete(int pusr){ if(delf[order[pusr]]) { delf[order[pusr]]=0; return 0; } else return -1;}int save(){ char fn[80]; char errs[128]; int fd; long size; int i; sprintf(fn,"%s/bas/user.dat",RP); fd=open(fn,O_WRONLY|O_TRUNC); if(fd==-1) { fd=open(fn,O_CREAT|O_WRONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showerr(errs); return -1; } } sort(nusr); size=sizeof(struct users); for(i=0;i<nusr;i++) if(delf[i]==0) write(fd,(char *)(usr+i),size); close(fd); return 0;}int get_n(int y,int x,char *prompt,int *n,int b){ char c,ss[128]; int i; sprintf(ss,"%d",*n); for(i=strlen(ss);i<b-1;i++) ss[i]=' '; ss[b-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=b-1) c=0x0d; else c=getkey(); switch(c) { case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) *n=atoi(ss); return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else { ss[--i]=' '; ss[i]='\0'; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ss[i++]=c; ss[i]='\0'; break; default: printf("\7\7"); break; } mvaddstr(y,x,ss); refresh(); }}int get_s(int y,int x,char prompt[],char s[],int n) /* x,y location of cursor; s the string */ /* n length of s; */{ char c,ss[128]; int i; for(i=0;i<n-1;i++) ss[i]=' '; ss[n-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,s); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=n-1) c=0x0d; else c=getkey(); switch(c) { case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) { ss[i]='\0'; strcpy(s,ss); } return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else ss[--i]=' '; break; default: ss[i++]=c; break; } mvaddstr(y,x,ss); refresh(); }}getkey(){ char c,key; char keys[]={Up,Down,Right,Left,NONE,NONE,PgDn,Home, PgUp,NONE,End,Ins}; void timeint(); sigset(SIGALRM,timeint); key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } sigignore(SIGALRM); return key;}void timeint(){}show(int susr,int pusr){ static int s=-1; static int p=-1; static int o[ROWS]; int i; move(2,70); clrtoeol(); if(nusr<=0) { mvaddstr(2,70,"0/0"); clrscr(); refresh(); return; } else mvprintw(2,70,"%d/%d",pusr+1,nusr); if(nusr==0) return; mvaddch(p-s+ROW,col[0]-2,' '); if(p!=pusr) p=pusr; if(s==susr) for(i=0;i<ROWS&&s+i<nusr&&o[i]==order[s+i];i++) ; if(s!=susr||(i<ROWS&&s+i<nusr)) { s=susr; clrscr(); for(i=0;i<ROWS&&(s+i)<nusr;i++) { o[i]=order[s+i]; showone(ROW+i,o[i]); } } mvaddch(p-s+ROW,col[0]-2,'>'); refresh();}showone(int row,int n,int nn){ int i; if(delf[n]) mvaddch(row,col[0]-1,'*'); mvprintw(row,col[0],"%d",usr[n].no); for(i=0;i<njob&&usr[n].job!=job[i].no;i++) ; if(i<njob) mvaddstr(row,col[1],job[i].name); else mvaddstr(row,col[1],"(无)"); mvaddstr(row,col[2],usr[n].code); mvaddstr(row,col[3],usr[n].name); mvaddstr(row,col[4],usr[n].pw);}int appoint(){ int n; n=-1; if(get_n(INROW,30,"请输入序号: ",&n,6)==-1) return -1; return n;}clrscr(){ int i; for(i=0;i<ROWS;i++) { move(ROW+i,0); clrtoeol(); } refresh();}showerr(char s[]){ move(ERRROW,0); clrtoeol(); mvaddstr(ERRROW,(80-strlen(s))/2,s); refresh(); printf("\7\7");}clrerr(){ move(ERRROW,0); clrtoeol(); refresh();}clrin(){ move(INROW,0); clrtoeol(); refresh();}int yn(char *p){ char c; do{ move(INROW,0); clrtoeol(); mvprintw(INROW,40-strlen(p)/2,p); move(INROW,41+strlen(p)/2); refresh(); c=getkey(); }while(c!='y'&&c!='Y'&&c!='n'&&c!='N'); if(c>='A'&&c<='Z') c=c-'A'+'a'; if(c=='y') return 0; else return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -