操作系统报告
- 格式:doc
- 大小:647.50 KB
- 文档页数:15
源程序:#include<iostream.h>#include <math.h>#include<iomanip.h>#include "stdio.h"#include "stdlib.h"#include "string.h"#define INODENUM 100#define FILENUM 100int a[10][10]; //磁盘块使用情况记录char choice;char argv[20]; // 用户参数,按名寻找int inum_cur=0; // 当前目录char temp[100]; // 缓冲区FILE *fp; // 打开文件指针//文件控制块数组struct Inode{int inum; //标志是否有效,若有效表示结点序号int iparent; //父节点int length; // 所占字节数char file_name[20]; //目录或文件的名字char type; //表示目录时存'd',表示文件时存'-' int blocknum; //所占磁盘块号} inode_array[INODENUM];// 打开文件表数组struct File_table{int inum;int iparent;int length;char file_name[20];int mode; //文件权限(读、写、读写)int blocknum; //所占磁盘块号} file_array[FILENUM];//初始化文件控制块数组及打开文件数组void init(){int i;inode_array[0].inum=0;strcat(inode_array[0].file_name,"c");inode_array[0].type='d';for(i=1;i<100;i++){inode_array[i].inum=-1;file_array[i].inum=-1;}int init1(){int i;printf("\n* * * * * * * * * * * * * *\n");printf("欢迎进入文件管理系统\n");printf("* * * * * * * * * * * * * *\n");printf("1--创建、删除、显示目录\n");printf("2--在当前目录下创建文件\n");printf("3--打开当前目录下的文件\n");printf("4--输入文件名写文件内容\n");printf("5--输入文件名读文件内容\n");printf("6--关闭文件\n");printf("7--磁盘使用情况查询\n");printf("8--显示此目录下的文件及目录\n");printf("0--文件系统关闭\n");printf("请选择:\n");scanf("%d",&i);return(i);}//求当前目录的路径(ls函数的一部分)void pathset(){char path[100];int m,n;strcpy(path,inode_array[0].file_name);m=0;n=inum_cur;while(m != inum_cur){while(inode_array[n].iparent != m){n = inode_array[n].iparent;}strcat(path,"/");strcat(path,inode_array[n].file_name);m = n;n = inum_cur;}printf("[%s]@",path);//根据名字设置当前目录void cd(void){int i;printf("\n请输入设置为当前目录的名字,输入'..'使当前目录的总目录成为当前目录\n"); scanf("%s",argv);if(!strcmp(argv, ".."))inum_cur = inode_array[inum_cur].iparent;else{// 遍历i节点数组,在当前目录下寻找指定名字的目录for(i = 0; i < INODENUM; i++)if((inode_array[i].inum>0)&&(inode_array[i].type=='d')&&!strcmp(inode_array[i].file_name,argv))break;if(i == INODENUM)printf("所输入的目录名不存在\n");else inum_cur = i;}}// 功能: 显示当前目录下的子目录和文件(ls函数的一部分)void dir(void){int i;int dcount=0,fcount=0;short bcount=0;// 遍历i节点数组, 显示当前目录下的子目录和文件名for(i = 0; i < INODENUM; i++)if((inode_array[i].inum> 0) &&(inode_array[i].iparent == inum_cur)){if(inode_array[i].type == 'd'){dcount++;printf("%-20s<目录>\n", inode_array[i].file_name);}if(inode_array[i].type == '-'){fcount++;bcount+=inode_array[i].length;printf("%-20s%12d B\n", inode_array[i].file_name,inode_array[i].length);}}printf("\n %d 个文件所占总空间数%11d 比特\n",fcount,bcount); }// 功能: 在当前目录下创建子目录或文件(mkdir dir1)void mkdir(void){int i,j;// 遍历i节点数组, 查找未用的i节点for(i = 0; i < INODENUM; i++)if(inode_array[i].inum < 0) break;if(i == INODENUM){printf("系统空间已满\n");exit(-1);}printf("\n请输入将要创建目录或文件的名字\n");scanf("%s",argv);j=i;printf("\n请选择,1创建文件2创建目录\n");scanf("%d",&i);if(i==1){for(i = 0; i < INODENUM; i++) //确保不重复命名{if((inode_array[i].inum > 0) &&(inode_array[i].type == '-') &&!strcmp(inode_array[i].file_name, argv)){printf("文件名已存在.\n");return ;}}i=j;inode_array[i].inum = i;strcpy(inode_array[i].file_name, argv);inode_array[i].type = '-';inode_array[i].iparent = inum_cur;inode_array[i].length = 0;}else{for(i = 0; i < INODENUM; i++) //确保不重复命名{if((inode_array[i].inum > 0) &&(inode_array[i].type == 'd') &&!strcmp(inode_array[i].file_name, argv)){printf("目录名已存在.\n");return ;}}i=j;inode_array[i].inum = i;strcpy(inode_array[i].file_name, argv);inode_array[i].type = 'd';inode_array[i].iparent = inum_cur;inode_array[i].length = 0;}}/*删除*/void delet(int innum){int block,i,j;inode_array[innum].inum = -1;block=inode_array[innum].blocknum;i=block/10;j=block%10;a[i][j]=0;}// 功能: 删除目录树(rd dir1)void deldir(){int i,j,t,flag=0;printf("\n请输入将要删除目录的名字(只能是在当前路径下的子目录),\n"); scanf("%s",argv);for(i = 0; i < INODENUM; i++)//查找待删除目录if((inode_array[i].inum > 0) &&//是否为空(inode_array[i].iparent == inum_cur) &&(inode_array[i].type == 'd')&&(!strcmp(inode_array[i].file_name,argv))){j=inode_array[i].inum;for(t=0;t<INODENUM;t++){if((inode_array[t].inum>0)&&(inode_array[t].iparent==j)&&(inode_array[i].type == '-'))delet(t);//目录下有文件则删除else if((inode_array[t].inum>0)&&(inode_array[t].iparent==j)&&(inode_array[t].length==0)&&(inode_array[t].type == 'd'))inode_array[t].inum=-1;//目录下有空目录则删除else if((inode_array[t].inum>0)&&(inode_array[t].iparent==j)&&(inode_array[t].length!=0)&&(inode_array[t].type == 'd'))break;//目录下有非空目录不能删除}if(t == INODENUM)inode_array[j].inum=-1;//下层目录为空删除之else{printf("目录下有非空目录不能删除,删除失败\n"); return;}}printf("删除成功\n");//待删除目录为空删除之return;}// 功能: 打开当前目录下的文件(open file1)void open(){int i, inum, mode, filenum;printf("\n请输入将要打开文件的名字\n");scanf("%s",argv);for(i = 0; i < INODENUM; i++)if((inode_array[i].inum > 0) &&(inode_array[i].type == '-') &&!strcmp(inode_array[i].file_name,argv))break;if(i == INODENUM){printf("该文件不存在\n");return ;}printf("请输入打开方式:(1: 只读, 2: 只写, 3: 读和写):");scanf("%d", &mode);gets(temp);if((mode < 1) || (mode > 3)){printf("打开错误.\n");return;}filenum = i;inum=i;for(i = 0; i < FILENUM; i++)if(file_array[i].inum < 0) break;if(i == FILENUM){printf("内存已满,无法打开文件.\n");return ;}file_array[filenum].inum = inum;strcpy(file_array[filenum].file_name, inode_array[inum].file_name); file_array[filenum].mode = mode;file_array[filenum].blocknum = inode_array[inum].blocknum;printf("打开文件%s 通过", file_array[filenum].file_name);if(mode == 1) printf("只读方式.\n");else if(mode == 2) printf("只写方式.\n");else printf("读写方式.\n");}// 功能: 关闭已经打开的文件(close file1)void close(void){int i;printf("\n请输入将要关闭的文件名字\n");scanf("%s",argv);for(i = 0; i < FILENUM; i++)if((file_array[i].inum > 0) &&!strcmp(file_array[i].file_name, argv)) break;if(i == FILENUM){printf("该文件没有打开.\n");return ;}else{file_array[i].inum = -1;printf("关闭%s 成功!\\n", argv);}}// 功能: 从文件中读出字符(read file1)void read(){int i, inum;char ch;printf("\n请输入将要读的文件名字\n");scanf("%s",argv);for(i = 0; i < FILENUM; i++)if((file_array[i].inum > 0) &&!strcmp(file_array[i].file_name,argv))break;if(i == FILENUM){printf("请先打开%s 文件.\n", argv);return ;}else if(file_array[i].mode == 2){printf("不可读%s.\n", argv);return ;}inum = file_array[i].inum;printf(" %s 文件的长度是:%d.\n", argv, inode_array[inum].length); printf(" 所占磁盘号是:%d.\n", inode_array[inum].blocknum); printf("文件内容是:\n");fp=fopen(file_array[inum].file_name,"r");ch=fgetc(fp); /*读出文件到内存*/while(ch!=EOF){printf("%c",ch);ch=fgetc(fp);}fclose(fp);getchar();}// 功能: 向文件中写入字符(write file1)void write(){int i, inum, length,j,k,blocknum;char ch;printf("\n请输入将要写的文件名字\n");scanf("%s",argv);for(i = 0; i < FILENUM; i++)if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv)) break;if(i == FILENUM){printf("请先打开%s 文件.\n", argv);return ;}else if(file_array[i].mode == 1){printf("不能写%s.\n", argv);return ;}inum = file_array[i].inum;printf("输入长度,长度在(0-50)个字节之间\n");scanf("%d", &length);gets(temp);if((length < 0) && (length >50)){printf("输入错误\n");return ;}for(j=0;j<10;j++){for(k=0;k<10;k++) if(a[j][k]==0)break;if(k<10)break;}if(j>=10){printf("磁盘已满,不能写入\n");return;}printf(" %s长度是:%d\n", inode_array[inum].file_name, length); i=inode_array[inum].iparent; //所在的目录长度增加inode_array[i].length+=length;a[j][k]=1;blocknum=10*j+k;inode_array[inum].length = length;inode_array[inum].blocknum = blocknum;fp=fopen(argv,"w");printf("\n请输入内容('#'结束):\n");ch=getchar();k=0;while(ch!='#'&&k<length){fputc(ch,fp);ch=getchar();k++;}fclose(fp);getchar();}//磁盘使用情况void bit_map(){int s=0;cout<<"---------------------------------------------------------------"<<endl;for(int p=0;p<10;p++){for(int q=0;q<10;q++)cout<<a[p][q]<<" ";cout<<endl;}cout<<"----------------------------------------------------------------"<<endl;for(int p1=0;p1<10;p1++)for(int q1=0;q1<10;q1++)if(a[p1][q1]==1)s=s+1;s=100-s;cout<<"剩余盘块数:"<<s<<endl;}void main(){ char username[20],password[20];int choice=1;int flag=1,i,x,j;cout <<"\t\t************************************************\n";cout <<"\t\t* *\n";cout <<"\t\t* 初始化,建立文件系统*\n";cout <<"\t\t* *\n";cout <<"\t\t************************************************\n";cout<<" 建立的位示图为:"<<endl;bit_map();cout<<"行数:"<<10<<" 列数: "<<10<<endl;init();cout <<"\t\t************************************************\n"; cout <<"\t\t* *\n"; cout <<"\t\t* 行号、列号与磁盘块号的转换公式为:*\n"; cout <<"\t\t* 磁盘块号=行号*32+列号*\n"; cout <<"\t\t* 行号=磁盘块号/32 *\n"; cout <<"\t\t* 列号=磁盘块号%32 *\n"; cout <<"\t\t* *\n"; cout <<"\t\t************************************************\n";label:printf("请输入用户名字:\n");scanf("%s",username);printf("请输入用户密码:\n");scanf("%s",password);if(strcmp(username,"##")!=0||strcmp(password,"02")!=0){printf("输入错误重新输入\n");goto label;}else{while(flag){i=init1();getchar();switch(i){case 0:flag=0;exit(0);break;case 1:while(choice!=0){printf("欢迎进入目录管理系统\n");for(j=0;j<30;j++)printf("* ");printf("\n1--显示当前目录路径\n");printf("2--指定目录为当前目录\n");printf("3--创建子目录\n");printf("4--显示当前目录的子目录及文件\n");printf("5--删除目录树\n");printf("请选择\n:");scanf("%d",&x);while(x<1||x>5){printf("\n输入错误,请重新输入\n");scanf("%d",&x);}switch(x){case 1: pathset();break;case 2: cd();break;case 3: mkdir();break;case 4: dir();break;case 5: deldir();break;}printf("\n是否继续目录操作?(0 or 1),1继续, 0结束\n");scanf("%d",&choice);getchar();} break;case 2: mkdir();break;case 3: open();break;case 4: write();break;case 5: read();break;case 6: close();break;case 7: bit_map();break;case 8: dir();break;default:printf("\n\n输入错误请重新输入\n");getchar();break;}}}}实验结果:1.初始化进入程序之前:2. 输入用户名密码进入文件管理系统:3. 选择1,进如目录管理程序进行目录的创建、删除、显示子目录等(输入1继续操作)4. 选择3创建子目录x,y,z5. 选择4,显示当前子目录6.选择5,删除目录树z7.选择2,设置目录x为当前目录8.选择1 ,显示当前目录路径(7)(选择0退出目录管理程序)9.选择2,在x目录下建两个文件a,b,操作如4,并显示10.选择3,打开文件a,输入打开方式11.选择4,在a中写入数据12.选择5,读出a中的内容13.选择6,关闭文件a14.选择7,显示磁盘使用情况15.读b文件时,由于b没打开,提示先打开b。