0324操作系统cmd功能的扩展
需求:1、实现清屏功能
2、实现不区分大小写功能
3、添加功能能添加新的命令符
设计:1、使用system("cls")清屏。
2、使用strlwr()函数把大写都变成小写
3、(1)使用菜单做选择项,让用户进入添加命令功能
(2)写进文件,再从文件夹中读取
#include<stdio.h>//stdio 就是指 “standard input & output"(标准输入输出) //所以,源代码中如用到标准输入输出函数时,就要包含这个头文件! //例如c语言中的 printf("%d",i); scanf("%d",&i);等函数 #include<string.h>//在使用到字符数组时需要使用 #include<stdlib.h> #define Max 500 struct Cmd{ char cmd[30]; char function[500]; int post; }; int count=0; struct Cmd cm[Max]; //定义结构体 void menu(){ printf("\t\t\t|--------------------------|\n"); printf("\t\t\t| 1、进入cmd |\n"); printf("\t\t\t| 2、添加命令 |\n"); printf("\t\t\t|--------------------------|\n"); } void menu2(){ printf("\t\t\t|--------------------------|\n"); printf("\t\t\t| 1、回到主界面 |\n"); printf("\t\t\t| 2、退出 |\n"); printf("\t\t\t|--------------------------|\n"); } void Init(struct Cmd cm[Max]) { FILE *fp; if((fp=fopen("cmd.txt","a+"))==NULL) { printf("File open error!\n"); exit(0); } while(!feof(fp)&&fgetc(fp)!=EOF) { fseek(fp,-1L,SEEK_CUR); fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post); count++; } if(fclose(fp)) { printf("Can not close the file!\n"); exit(0); } } void display(struct Cmd cm[Max]) //读出文件 { for(int i=0;i<count;i++) { printf("%-10s%s\n",strupr(cm[i].cmd),cm[i].function); strlwr(cm[i].cmd); } } void Putout1(){ printf("Microsoft Windows XP [版本 5.1.2600]\n"); printf("(C) 版权所有 1985-2001 Microsoft Corp.\n"); } void Strcmp1(char str[10]) { int i; if(strcmp(str,"help")==0) { printf("有关某个命令的详细信息,请键入 HELP 命令名\n"); display(cm); } else if(strcmp(str,"cd")==0) printf("cd 内部命令 显示当前目录的名称或将其更改\n"); else if(strcmp(str,"md")==0) printf("md 内部命令 创建一个目录\n"); else if(strcmp(str,"rd")==0) printf("rd 内部命令 删除目录\n"); else if(strcmp(str,"cls")==0) { printf("cls 内部命令 清除屏幕\n"); system("cls"); } else if(strcmp(str,"date")==0) printf("date 内部命令 显示或设置日期\n"); else if(strcmp(str,"time")==0) printf("time 内部命令 内部命令显示或设置系统时间\n"); else if(strcmp(str,"ren")==0) printf("ren 内部命令 重新命名文件\n"); else if(strcmp(str,"cope")==0) printf("cope 内部命令 将至少一个文件复制到另一个位置\n"); else if(strcmp(str,"quit")==0) exit(0); else if(strcmp(str,"dir")==0) printf("dir 内部命令 显示一个目录的文件和子目录\n"); else { for(i=0;i<count;i++) { if(strcmp(str,cm[i].cmd)==0) { if(cm[i].post==1) printf("'%s' 内部命令输入正确!\n该命令作用是:%s\n",str,cm[i].function); else printf("'%s' 外部命令输入正确!\n该命令作用是:%s\n",str,cm[i].function); goto abc; } } printf("'%s'不是内部或外部命令,也不是可运行的程序\n",str); printf("或批处理文件。\n"); } abc: printf("\n"); } void process(struct Cmd cm[Max]) { char str[10]; Putout1(); while(1) { printf("\nC:\\Documents and Settings\\hskd>"); scanf("%s",str); strlwr(str); Strcmp1(str); } } int main() { FILE *fp; int i,j,k,f; struct Cmd tempcm[Max]; bbc: menu(); scanf("%d",&i); if(i==1) { Init(cm); process(cm); } else if(i==2) { printf("请问需要输入多少个命令:\n"); scanf("%d",&j); for(k=0;k<j;k++) { printf("请分别输入第%d个指令的符号、功能和属性:\n",k+1); scanf("%s%s%d",&tempcm[k].cmd,&tempcm[k].function,&tempcm[k].post); } Init(cm); for(k=0;k<j;k++) { cm[count+k+1]=tempcm[k]; } count=count+j+1; // display(cm); if((fp=fopen("cmd.txt","w"))==NULL) { printf("打开失败"); exit(0); } fp=fopen("cmd.txt","w"); for(k=0;k<count;k++) { fprintf(fp,"%s%s%d\n",cm[k].cmd,cm[k].function,cm[k].post); } /* fwrite(cm,sizeof(Cmd),count,fp);*/ fclose(fp); } else { printf("输入有误,请重新输入\n"); goto bbc; } bbd: menu2(); scanf("%d",&f); if(f==1) goto bbc; else if(f==2) exit(0); else { printf("输入有误,请重新输入\n"); goto bbd; } }
运行结果:
备注:对这次做的特别不满意,啊啊啊啊啊……可惜时间紧,虽然写代码不是本课程的重点,但反映出来C语言文件写入读出还不熟练,嗯,明日再战斗!!!