《操作系统课程设计》
实验一:命令行解释程序
学 院: 信息学院 专 业: 计算机科学与技术
课 程: 操作系统 班 级: 1 1 0 3 B
姓 名: 傅 笔 贵 学 号: 2009080305302
2014年 7 月 10 日
一.采用的数据结构说明
字符数组:
本程序中包含的字符数组有:
filename1[20]:在Ccopy()函数中,存储源文件路径和名字的字符数组。
filename2[20]:在Ccopy()函数中,存储目标文件路径和名字的字符数组。
oldname[20]:在Cmv()函数中用来保存源文件路径和名字的字符数组。
newname[20]:在Cmv()函数中用来保存目标文件路径和名字的字符数组。
Cho2[6]:存取用户输入的指令,并用来作为Switch分支的判定条件之一。
File[20]:Cerase()函数中用来存放要删除的文件的路径和名字的字符数组。
Word[100]:在Cdis()中存放用户要回显的字符串。
二.源程序清单、注释和流程图
(1)流程图
(2)源程序和注释
#include #include #include #include #include #include #include int flag=1; char ch[8];//存储文件读取内容的中间变量 FILE *fp; FILE *fp1; char filename1[20];/*复制文件候存放的原文件名*/ char filename2[20];/*复制文件候存放的目标文件名*/ char oldname[20];/*用来存放移动文件的源文件名*/ char newname[20];/*用来存放移动文件的目标文件名*/ void start_copy(char *filename1,char *filename2) /*文件复制函数,可以实现文本和图片的复制*/ { if((fp=fopen(filename1,"rb"))==NULL||(fp1=fopen(filename2,"wb"))==NULL) /*源文件或目标文件打开失败则无法进行复制*/ { printf("can't open the source file!\\n"); exit(0); } else { fread(ch,1,8,fp);//一次读取八个字节的字节流,存放到ch字符数组里 while (!feof(fp))//没读取到文件尾部时,持续读取 { fwrite(ch,1,8,fp1);//写到目标文件里 fread(ch,1,8,fp);//继续读取 } fclose(fp);//关闭指针,释放内存 fclose(fp1); } } void Cend() { flag=0;//将循环条件flag=1变为0来结束循环,结束程序 } void Cdir() { /*目录显示函数,除了调用Cmd没有更好的 解决办法,是本程序的遗憾.*/ system("cmd.exe /b dir"); } void Ccopy()//文件复制主函数 { scanf("%s%s",&filename1,&filename2);//获取源文件和目标文件名 start_copy(filename1,filename2);//传参到复制函数 } void Cerase()//删除文件函数 { char File[20];//文件名存储 scanf("%s",&File);//获得文件名 if(remove(File)==0)//删除成功remove返回0 { printf("Remove %s Successfully!\\n",File); } else { perror("Failed!"); } } void Cdis() { char Word[100];//存放用户输入的字符串 getchar();//吸取第一个不必要的空格字符 gets(Word);//获得用户的字符串内容 printf("---------E---C---H---O-------------\\n"); puts(Word);//显示用户的字符串内容 } void Cmv()//移动或重命名文件函数 { scanf("%s%s",&oldname,&newname);//用来获取用户输入的两个文件名 rename(oldname,newname); } int main() { //定义判定字符 char cdir1[]="Cdir"; char cdir2[]="cdir"; char ccopy1[]="Ccopy"; char ccopy2[]="ccopy"; char cerase1[]="Cerase"; char cerase2[]="cerase"; char cdis1[]="Cdis"; char cdis2[]="cdis"; char cend1[]="Cend"; char cend2[]="cend"; char clr1[]="Cclr"; char clr2[]="cclr"; char cmv1[]="Cmv"; char cmv2[]="cmv"; char cuname1[]="Cuname"; char cuname2[]="cuname"; while(flag) { char Cho[100]={0}; char Cho2[6]; int num=0; /*主菜单*/ printf("-----------------------------------\\n"); printf("---------M E N U----------\\n"); printf("-----------------------------------\\n"); printf("Cdir . Show the Detail of Dir and files.\\n"); printf("Ccopy . Copy the file.\\n"); printf("Cerase . Erase(Delete) the file.\\n"); printf("Cdis . The Echo of your input words\\n"); printf("Cclr . Clear the Screen.\\n"); printf("Cmv . Move Or Rename the file.\\n"); printf("Cuname . Show CPU Info.\\n"); printf("Cend . Quit.\\n"); printf("\\n"); printf("\\n"); printf("Please Enter The Command:"); scanf("%s",&Cho2); /*下面这一段将对用户输入的字符串第一个空格前的 内容进行判定,确定功能号,在转入对应的Case分支 决定用户本次所使用的功能.*/ if(strcmp(Cho2,cdir1)==0||strcmp(Cho2,cdir2)==0)//首字母大小写均可识别 { num=1; } else if(strcmp(Cho2,ccopy1)==0||strcmp(Cho2,ccopy2)==0) { num=2; } else if(strcmp(Cho2,cerase1)==0||strcmp(Cho2,cerase2)==0) { num=3; } else if(strcmp(Cho2,cdis1)==0||strcmp(Cho2,cdis2)==0) { num=4; } else if(strcmp(Cho2,cend1)==0||strcmp(Cho2,cend2)==0) { num=5; } else if(strcmp(Cho2,clr1)==0||strcmp(Cho2,clr2)==0) { num=6; } else if(strcmp(Cho2,cmv1)==0||strcmp(Cho2,cmv2)==0) { num=7; } else if(strcmp(Cho2,cuname1)==0||strcmp(Cho2,cuname2)==0) { num=8; } else { printf("ERROR COMMAND,TRY AGAIN!\\n"); } switch(num) { case(1):Cdir();break;//功能1,启动Cmd调用dir \\b检查目录 case(2):Ccopy();getchar();break;//功能2,复制一个文件到另一个目录 case(3):Cerase();break;//功能3,删除一个指定路径的文件 case(4):Cdis();break;//功能4,回显用户输入的字符串内容 case(5):Cend();break;//功能5,结束程序 case(6):system("cls");break;//功能6,清屏 case(7):Cmv();break;//功能7,移动一个文件,如果路径不变只改变名字,则变为重命名功能 case(8):system("systemInfo");break;//功能8,显示计算机详细信息 } } } 三.Windows命令与Linux命令的不同 本程序的功能有8个,其中Cdir和Linux下的ls基本区别不大,但是ls后面有很多参数,这是和Windows在cmd下调用dir不太一样的地方。 Ccopy和Linux下的Cp命令没有什么区别。 Cerase和Linux的rm是有区别的,Linux删除的文件是无法补救的,因此在删除之前会有提示是否要真的删除,rm –r可以连同文件的子目录都删除,这点和windows下的rmdir类似。 Cdis是我自定的回显函数,和Linux的Echo一样。 Cend就是单纯的退出程序,和Linux的Logout一样。 Cclr是清屏功能,就是Linux下的clear指令。 Cmv是移动文件指令,如果路径不做变化,那么就会变成重命名的功能,和Linux的mv功能一样,移动的时候子目录也会一起移动。 四.收获体会 C语言一直都是十分经典的编程语言,本次操作系统实训让我重新巩固了下曾经学过的C语言知识,虽然只是实现简单的Shell模拟,而且仅仅是少数功能的模拟,也耗费了我很多的时间,而且为了能更好的符合要求,我还和同学们一起讨论得到了最好的结果,在训练了编程语言的同时,也增加了和同学之间的交流能力,还更好的理解了Shell指令的工作原理,是个一举三得的实训课程! 未来还有一周的实训课程,而且内容会更加困难,我想这会是一次非常好的机会来加深对操作系统这门课的理解,继续努力!下载本文