2012-7-5可樂的模拟操作系统-文件…

原代码:
#include<stdio.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
struct linkf
{
     char username[16];
     struct links *next;
};
struct linkr
{
     char name[16];
     int sex;
     struct linkr *next;
};
struct links
{
     char filename[16];
     struct linkr *headlink;
     int length;
     struct links *next;
};
struct linkt
{
     char filename[16];
     int flag;
     int length;
     struct linkr *headlink;
     struct linkt *next;
};

struct linkf mfd[5];
struct links *ufd,*p2,*q2;
struct linkr *p,*q;
struct linkt *afd,*p3,*q3;
char X[16],s,username[16],name[16],ri,chg;
int r,i,w,k,n,m,j,t,flag,id,mi;

void print1()
{
   int i;
   printf("\n MFD:\n");
   printf("----------------\n");
   for(i=0;i<n;i++)
   {
   printf("| %s",mfd[i].username);
   printf("\n----------------\n");
   }
}

void print2()
{
   int i;
   for(i=0;i<n;i++)
     if (flag==i && ufd!=NULL)
   {
   printf("\nMFD__[%s]\n",mfd[5].username);
   p2=mfd[5].next;
   printf("+_UFD-Filename_+_   Length   _+\n");//通过该用户进入该文件的过程
   while(p2!=NULL)
   {
     printf("|s             |\n",p2->filename,p2->length);
     p2=p2->next;
     printf("+--------------+--------------+\n");
   }
       }
   if(ufd==NULL) printf("\nUFD_[%s] is NULL\n",username);
     if(afd!=NULL)
   {
   p3=afd;
         printf("\n\nAFD_[%s]\n",username);
         printf("+-----Filename-----+----length---+\n");//打开该文件过程
   while(p3!=NULL)
   {
     printf("|s            %d       |\n",
           p3->filename,p3->length);
           p3=p3->next;
           printf("+------------------|-------------+\n");
   }
     }
   else printf("\n\nAFD_[%s]   is NULL\n",username);
}

void print3()//fileplay,打开文件并显示文件内容。
{
   int i;
     p3=afd;
     printf("Input printing-filename:"); scanf("%s",X);
     if(p3!=NULL)
   {
   while((strcmp(p3->filename,X)!=0)&&(p3->next!=NULL))
         p3=p3->next;
         if(strcmp(p3->filename,X)==0)
         printf("The file hasn't opened!\n");
         else
   if(p3->headlink==NULL) printf("The file is NULL!\n");
   else
   {
     p=p3->headlink; i=1;
             printf("|   num        name        sex   |\n");
             printf("---------------------------------------\n");
             while (p!=NULL)
     {
     if (p->sex)
       printf("|]     |s        'man'   |\n",i,p->name);
     else
       printf("|]     |s       | 'woman' |\n",i,p->name);
     i++; p=p->next;
               printf("---------------------------------------\n");
     }
   }
   }
   else printf("The file hasn't opened!\n");
   }
  
void create()
{
   printf("Input create filename:");scanf("%s",X);
     q2=ufd;
     if (q2!=NULL)
   {
   while((strcmp(q2->filename,X)!=0)&&(q2->next!=NULL))
         q2=q2->next;
         if(strcmp(q2->filename,X)==0)
   {
     printf("File has already been created!\n");
     return;
   }
   }
     p2=(struct links *)malloc(sizeof(struct links));
     if(ufd==NULL) ufd=p2; else q2->next=p2;
     strcpy(p2->filename,X);
     p2->length=0;
     p2->next=NULL;
     p2->headlink=NULL;
   printf("\"%s\" Create File is Finished!\n",X);
}

void open()
{
   p2=ufd;
     printf("Input Open filename:");scanf("%s",X);
     if(p2!=NULL)
   {
   while((strcmp(p2->filename,X)!=0)&&(p2->next!=NULL))
         p2=p2->next;
         if(strcmp(p2->filename,X)==0)
   {
     q3=afd;
     if(afd!=NULL)
     {
     while((strcmp(q3->filename,X)!=0)&&(q3->next!=NULL))
       q3=q3->next;
     if(strcmp(q3->filename,X)==0)
     {
       printf("The file \"%s\" has been opened.\n",X);
       return;
     }
     }
     p3=(struct linkt *)malloc(sizeof(struct linkt));
     if(afd==NULL) afd=p3; else q3->next=p3;
     strcpy(p3->filename,X);
     p3->length=p2->length;
           p3->headlink=p2->headlink;
           p3->flag=0;
           p3->next=NULL;
           printf("The file \"%s\" is opened.\n",X);
           return;
   }
   }
   printf("Can't find \"%s\" file in \"%s\" USER.\n",X,username);
}

void Close()
{
if (afd)
{
   p3=afd;
   while(strcmp(p3->filename,X)!=0&&p3->next!=NULL) {q3=p3;p3=p3->next;}
   if (strcmp(p3->filename,X)==0)
   {
     if (strcmp(afd->filename,X)==0){afd=afd->next;q3=afd;}
     else q3->next=p3->next;
     if (p3->flag)
     {
     p2=ufd;
     while(strcmp(p2->filename,p3->filename)!=0&&p2->next!=NULL) p2=p2->next;
     if(strcmp(p2->filename,p3->filename)==0)
     {p2->length=p3->length;p2->headlink=p3->headlink;}
     }
     free (p3);
     printf("The file \"%s\" is Closed.\n",X);
     return;
   }
}
printf("The file \"%s\" isn't opened!\n",X);
return;
}


void delete()
{
if (afd)
{
   q3=afd;
   while (strcmp(q3->filename,X)!=0&&q3->next) q3=q3->next;
   if (strcmp(q3->filename,X)==0) Close();
}
if(ufd)
{
   p2=ufd;
   while(strcmp(p2->filename,X)!=0&&p2->next!=NULL) {q2=p2;p2=p2->next;}
   if (strcmp(p2->filename,X)==0)
   {
     if (strcmp(ufd->filename,X)==0){ufd=ufd->next;q2=ufd;}
     else q2->next=p2->next;
     if (p2->headlink)
     {
     q=p=p2->headlink;
     while (p){p=q->next;free (q);p2->length--;q=p;}
     }
     free (p2);
     printf("The file \"%s\" is Deleted.\n",X);
     return;
   }
}
printf("The files \"%s\" is not found!\n",X);
return;
}

void close()
{
   while (afd!=NULL)
   {
   p3=afd; afd=afd->next;
   p2=ufd;
   while(strcmp(p2->filename,p3->filename)!=0&&p2->next!=NULL)
     p2=p2->next;
   if(strcmp(p2->filename,p3->filename)==0)
   {
     p2->length=p3->length;
     p2->headlink=p3->headlink;
   }
   free(p3);
     }
}

void read()
{
q3=afd;
if (q3)
{
   while(strcmp(q3->filename,X)!=0&&q3->next!=NULL)
   q3=q3->next;
   if (strcmp(q3->filename,X)==0)
   {
   q=q3->headlink;
   if(!q) {printf("The file \"%s\" is NULL!\n",X);return;}
   id=1;
   do
   {
     printf("Please Input Record-number:[   ]\b\b\b");
     getchar();
     scanf("%c",&ri);   
     if (ri-48>q3->length||ri-48<id)
     printf("Record-number is Wrong!\n");
   }while(ri-48>q3->length||ri-48<id); 
   while(id<ri-48)
   {q=q->next;id++;}
   printf("|   ID        name        sex   |\n");
   printf("---------------------------------------\n");
   if (q->sex)
     printf("|]     |s        'man'   |\n",id,q->name);     
   else
     printf("|]     |s       | 'woman' |\n",id,q->name);
   printf("---------------------------------------\n");
   do
   {
     printf("Do you want to change this file: (Y/N)[ ]\b\b");
     getchar();
     scanf("%c",&chg);   
   }while(chg!=121&&chg!=89&&chg!=110&&chg!=78);
   if (chg==121||chg==89)
   {
     printf("Please Input username:[             ]\b\b\b\b\b\b\b\b\b\b\b\b\b");scanf("%s",name);
     strcpy(q->name,name);
     printf("Please Input usersex:(0 or 1)[ ]\b\b");scanf("%d",&mi);
     q->sex=mi;
   }
   return;
   }
}
printf("The files \"%s\" isn't Opened!\n",X);
return;

}


void write()
{
q3=afd;
if (afd)
{
   while(strcmp(q3->filename,X)!=0&&q3->next!=NULL)
   q3=q3->next;
   if (strcmp(q3->filename,X)==0)
   
   p=(struct linkr *)malloc(sizeof(struct linkr));
   printf("Please Input Username:[             ]\b\b\b\b\b\b\b\b\b\b\b\b\b");
   scanf("%s",name);
   strcpy(p->name,name);
   printf("Please Input Usersex (0 or 1):[ ]\b\b");
   scanf("%d",&mi);
   if (mi==1)
     mi=1;
   else
     mi=0;  
   p->sex=mi;
   p->next=NULL;
   if (!q3->headlink) {q3->headlink=p;}
   else
    q=q3->headlink;
     while(q->next)
     q=q->next;
     q->next=p;
   }
   q3->flag=1;
   q3->length++;
   return;
   }
}
printf("The file \"%s\" isn't Opened.\n",X);
return;
}

 main()
{
afd=NULL;   ufd=NULL;
for (i=0;i<5;i++)
{
   strcpy(mfd[i].username,"                 ");
   mfd[i].next=NULL;
}
printf("User number N(N<=5)=");
scanf("%d",&n);
for(i=0;i<n;i++)
{
   w=0;
   printf("User MFD username X[%d]=",i+1);
   scanf("%s",X);
   for (j=0;j<n;j++)
   if (strcmp(mfd[j].username,X)==0) w=1;
   if(w==0) strcpy(mfd[i].username,X);
   else
   {
   printf("\nThe Username has been Created!\n");i--;
   }
}
do
{
   print1();
   do
   {
   printf("Input user name you want to operate:");
   scanf("%s",username);
   for(i=0;(i<n&&(strcmp(mfd[i].username,username)!=0));i++);
   if(i>=n)
   {
     printf("Not found Username!\n");
   }
   } while(i>=n);
   t=0; flag=i; ufd=mfd[i].next;
   do
   {
   printf("\n------------------------------------\n");
   printf("   1--Creat     2--Open     3--Delete\n");
   printf("   4--Close     5--Read     6--Write\n");
   printf("   7--Display   8--Fileplay 9--Quit\n");
   printf("------------------------------------\n");
   printf("               Select[ ]\b\b");
   scanf("%s",&s);  
   switch(s)
   {
   case '1':create();break;
   case '2':open();break;
   case '3':printf("Please Input Delete filename:[             ]\b\b\b\b\b\b\b\b\b\b\b\b\b");scanf("%s",X);delete();break;
   case '4':printf("Please Input Close filename:[             ]\b\b\b\b\b\b\b\b\b\b\b\b\b");scanf("%s",X);Close();break;
   case '5':printf("Please Input Read filename:[             ]\b\b\b\b\b\b\b\b\b\b\b\b\b");scanf("%s",X);read();break;
   case '6':printf("Please Input Write filename:[             ]\b\b\b\b\b\b\b\b\b\b\b\b\b");scanf("%s",X);write();break;
   case '7':print2();break;
   case '8':print3();break;
   case '9':t=1;close();
   }
   mfd[i].next=ufd;
   } while(!t);
   printf("\n---------------------------------------\n");
         printf("|   1--Edit other user    2--Quit     |\n" );
         printf("---------------------------------------\n");
         printf("                 Select[ ]\b\b");
         scanf("%d",&m);
         if(m==2)
   r=1;
   else 
   r=0;
} while(!r);
}
2012-7-5可樂的模拟操作系统-文件处理运行成功的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验二 UNIX磁盘空间管理算法 (一) 实验目的 掌握UNIX外存空间管理中的分组链接算法。 (二) 实验内容 编写C语言程序,模拟UNIX磁盘空间管理中使用的分组链接法。 1.定义一个记录磁盘块号的堆栈S—free[10],以及记录栈中现有磁盘块数的变量S—nfree。 2.定义一个由40个元素构成的结构数组block[40]用作磁盘块存放。 struct size { int blocl[10]; } struct blocd { struct size a[10]; //用于在空闲磁盘块号链中存放磁盘块号 }block[40]; 3. 假设系统中文件的最大容量为100个磁盘块,且最多只有5个文件,定义一个由5个元素构成的结构数组file[5]用于记录各个文件占用的磁盘块,。 struct File { int fileblocd[100]; //用于记录分别分配给文件的磁盘块号 }file[5]; 4. 编写函数init( )完成空闲磁盘块号堆栈、空闲磁盘块号队列及记录文件占用磁盘块状态的file结构数组。 5. 编写函数alloc(fileno,blockd),完成磁盘块的分配操作。其中的参数fileno为文件序号,用于指定需要分配的文件。 6. 编写函数free(fileno),完成文件占用磁盘块的释放操作。其中的参数fileno为文件序号,用于指定需要释放磁盘块的文件。 7. 编写main( )函数完成下列操作: 调用init( )函数完成初始设置。 从终端输入命令,控制磁盘块的分配与回收操作。 (三) 实验要求 1. 在程序运行的结果中应包含磁盘块的分配与回收操作。 2. 可根据输入的文件名、文件大小进行模拟磁盘分配,并在每次分配与回收后显示分配与回收是否成功,以及分配、回收的磁盘块号。 3. 在程序执行过程中,至少应包含分配不成功一次的信息。 4. 可以查看当前磁盘块的使用情况:哪些块空闲,哪些块被哪些文件占用。
在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的模拟Linux文件系统。 1. 在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。 2. 编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求: (1) 盘块大小1k (2) 空闲盘块的管理:Linux位图法 (3) 结构:超级块, i结点区, 根目录区 3. 该simdisk管理程序的功能要求如下: (1) info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) md …: 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) rd …: 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) newfile …: 建立文件。 (7) cat …: 打开文件。 (8) copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统与模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令: simdisk copy D:\data\sample\test.txt /test/data 或者:simdisk copy D:sample\test.txt /test/data (9) del …: 删除文件:删除指定文件,不存在时给出出错信息。 (10) check: 检测并恢复文件系统:对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值