⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp1.c

📁 文件系统
💻 C
字号:
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"
#define L 6  /* the most  numbers of  files*/
#define N 5 /* the most  numbers  of  users*/

char MFD[N][20]={"abc","xyz"};
int U;  
static int memo[128]={10,20,30,40,50,60,70,80,90};

struct FCB
{
    char filename[20];
    char access;
    int length;
    int flag;
    int write;
    int address[5];
    int p[5];
};

struct UOF
{
  char filename[20];
  char access;
  int length;
  int flag;
  int write;
  int cre_clo; /*1  is  creat;0  is  close*/
};

struct FCB UFD[N][L]={{
      {"a.txt",'w',3,1,3,{10,20,30},{10,20,30}},
      {"b.txt",'r',3,1,3,{40,50,60},{40,50,60}},
      {"c.txt",'w',3,1,3,{70,80,90},{70,80,90}}}};

struct UOF UOF[20];

void creat()
{
   int j,le,i,address;
   int m;
   char s[20];
   char ac;
   printf("请输入文件名。\n");
   scanf("%s",s);
   for(j=0;j<L;j++)
   if(strcmp(UFD[U][j].filename,s)==0)
   {
      printf("文件名相同不能创建。\n");
      break; 
   }
   if(j==L)
   {
      printf("输入长度。\n");
      scanf("%d",&le);    
      getchar();
      printf("输入状态。\n");
      scanf("%c",&ac);
      getchar();
      printf("输入第一个模块号地址。\n");
        scanf("%d",&address);
        for(j=0;j<128;j++)
        {
			if(memo[j]==0)
            { 
				memo[j]=address;
                break; 
			}
        }
        for(i=0;i<L;i++)
        {
          if(UFD[U][i].flag==0)
          { 
             strcpy(UFD[U][i].filename,s);
             UFD[U][i].access=ac;
             UFD[U][i].length=le;
             UFD[U][i].flag=1;
             UFD[U][i].address[0]=address;
             UFD[U][i].p[0]=UFD[U][i].address[0];
             m=i;  
             break;
          }
        }
        for(i=0;i<5;i++)
        {
          if(UOF[i].flag==0)
          { 
             strcpy(UOF[i].filename,s) ;
             UOF[i].length=le;
             UOF[i].access=ac;
             UOF[i].cre_clo=1;  
             UOF[i].flag=1;
             break;
          }
       }
       printf("\n文件创建成功。\n");
    }
}

void close(char name[20])
{
    int i;
    for(i=0;i<L;i++)
    if(strcmp(UOF[i].filename,name)==0)     
    {
       UOF[i].cre_clo=0;
       strcpy(UOF[i].filename,"");
       UOF[i].access=' ';
       UOF[i].length=0;
       UOF[i].write=0;
       UOF[i].flag=0;
       printf("文件关闭成功。\n");
       break;
    }
	if(i==L)
	printf("找不到文件!");
}

void del(char name[20])
{
    int i,j,address=0;
    for(i=0;i<L;i++)
    if(strcmp(UFD[U][i].filename,name)==0)
    {
        strcpy(UFD[U][i].filename,"");
        UFD[U][i].access=' ';
        UFD[U][i].length=0;
        UFD[U][i].write=0;
        UFD[U][i].flag=0;
        for(j=0;j<5;j++){ UFD[U][i].address[j]=address; }
        if(strcmp(UOF[i].filename,name)==0)
        {
           UOF[i].cre_clo=0;
           strcpy(UOF[i].filename,"");
           UOF[i].access=' ';
           UOF[i].length=0;
           UOF[i].write=0;
           UOF[i].flag=0;
        }
         printf("文件撤销成功。\n");
         break;
	}
	 if(i==L)
	 printf("文件已经被撤销!");
}

void read(char name[20])
{
   int i,b,k;
   printf("输入要读的长度。!\n");
   scanf("%d",&b);
   for(i=0;i<L;i++)
   if(strcmp(UOF[i].filename,name)==0)
   {
      if(b>UOF[i].length)
      printf("长度超出了文件的最大长度!");
	  else if(strcmp(UFD[U][i].filename,name)==0)
	  {  
		  for(k=0;k<b;k++)
		  {
	       printf("第%d个地址是%d\n",k,UFD[U][i].address[k]);
		  }
		  printf("文件读成功。\n");
	  }
      if(i==L)
      printf("文件没打开,不能进行读操作!");
   }    
}

void open()
{
   char na[20];
   char c;
   int x,m,j,i;
   printf("请输入要打开的文件名。\n");
   getchar(); 
   gets(na);
   printf("请输入您要进行的文件操作(W or R)。\n");
   c=getchar();  
   getchar();
   for(i=0;i<L;i++)
   {
      if(strcmp(UFD[U][i].filename,na)==0)
      {  
         m=i;
         for(j=0;j<20;j++)
         {
            if(strcmp(UOF[j].filename,na)==0)
            {
             if(UOF[j].cre_clo==1)
             {
                 printf("文件为创建属性,不能打开。\n");
                 break;
             }
           else
           {
           printf("文件已经打开。\n");
           break;
           }
        }
    }
     if(j==20)
     {
       if(UFD[U][m].access==c)
         {
           for(x=0;x<20;x++)
           if(UOF[x].flag==0)
           { 
              strcpy(UOF[x].filename,UFD[U][m].filename);
              UOF[x].length=UFD[U][m].length;
              UOF[x].access=UFD[U][m].access;
                  UOF[x].cre_clo=0;
                    UOF[x].flag=1;
              UOF[x].write=UFD[U][m].write;
              printf("文件打开成功。\n");  
              break;
              }
            }
       else
       {
         printf("操作错误。\n");
       } 
     }
     break;      
     }
   }
   if(i==L)
   {
     printf("文件不存在。\n");
   }
}

void write()
{
   char nam[20];
   int i,j,n,b,x,t,e,k; 
   int a;  
   int m;   
   static int ad[5];
   printf("请输入要写的文件名。 \n");
   getchar();
   gets(nam);
   for(x=0;x<6;x++)
   {
      if(strcmp(UFD[U][x].filename,nam)==0)
      {
         a=x;
         for(i=0;i<20;i++)
         {
            if(strcmp(UOF[i].filename,nam)==0)
            {
               if(UOF[i].cre_clo==1&&UFD[U][a].access!='r')
               {
                  m=i;
                  for(e=0;e<UFD[U][a].length;e++)
                  {
                     printf("输入第%d个地址。\n",e);
                     scanf("%d",&ad[e]);
                     for(k=0;k<20;k++)
                     if(ad[e]==memo[k])
                     {
                        printf("地址%d块号重复,请输入新的块号。\n",e);
                        scanf("%d",&ad[e]); 
                        break;
                     }
                     for(j=0;j<20;j++)
                     {
                        if(memo[j]==0)
                    	{ 
                           memo[j]=ad[e];
                           break;
                    	}
                     }
                     UFD[U][a].address[e]=ad[e];
                  }
                  UFD[U][a].p[1]=UFD[U][a].address[1];
                  UFD[U][a].p[2]=UFD[U][a].address[2];
                  UFD[U][a].p[3]=UFD[U][a].address[3];
                  UFD[U][a].p[4]=UFD[U][a].address[4];
				  {
                   for(j=0;j<UFD[U][a].length;j++)
                   UFD[U][a].p[UOF[m].write++]=UFD[U][a].address[j];
				  }
                   for(j=0;j<UFD[U][m].length;j++)
				   {
                      if(UFD[U][a].address[j]!=0)
                      UFD[U][a].write++;
				   }
                   break; 
				}
                else
				{
                   if(UFD[U][x].access=='r')
                   {
                      printf("文件不能进行写操作。\n");
                      break; 
                   }
                   else
                   {
                      printf("您要进行顺序修改还是选择修改(1/0,1为顺序修改,0为选择修改。)?\n");
                      scanf("%d",&n);
                      if(n==1)
                      {
                        for(e=0;e<UFD[U][x].length;e++)
                        {
                            printf("输入第%d个地址。\n",e+1);
                            scanf("%d",&ad[e]);
                            for(k=0;k<128;k++)
                           {
                              if(ad[e]==memo[k])
                              {
                                  printf("第个%d地址块号重复,请输入新的块号。\n",e);
                                  scanf("%d",&ad[e]);
                                  break;
                              }
                           }
                           for(j=0;j<128;j++)
                           {
                              if(memo[j]==0)
                              { 
                                 memo[j]=ad[e];
                                 break; 
                              }              
                           }
                        }
                         for(t=0;t<5;t++)
                         {
                            UFD[U][x].address[t]=ad[t];
                         }
                         for(t=0;t<5;t++)
                         UFD[U][x].p[t]=UFD[U][x].address[t];
                         printf("写文件成功。");
                         break;
                        }
                        else
                        {
                            printf("请输入你要修改的记录地址。\n");
                            scanf("%d",&b);
                            if(b<5)
							{
                                printf("第 %d 个记录是 %d",b,UFD[U][x].p[b]);
                                printf("\n输入新地址。\n");
                                for(j=0;j<L;j++)
                                { 
                                    if(UFD[U][x].p[b]==UFD[U][x].address[j])
                                    { 
										if(b<UFD[U][x].length)
										{
                                        scanf("%d",&UFD[U][x].address[j]);
                                        break;
										}
										if(b>=UFD[U][x].length)
										{
                                         scanf("%d",&UFD[U][x].address[j]);
                                         UFD[U][x].length++;
									     UOF[x].length++;
									     break;
										}
									}
                                }
                                printf("写文件成功。\n");  
                                break;
                                }
                                else printf("找不到记录。");
                                break;
                            }
                    	}
                  } 
             } 
        } 
        if(i==20)
        printf("文件未打开,不能进行写操作。\n");
        break;
        }   
       }
       if(x==6)
       {
         printf("文件未创建,不能进行写操作。 \n");
       }
}

void print_UFD()
{ 
   int i ;
   printf("num   filename  access length  flag    ad1     ad2     ad3     ad4     ad5   \n ");
   for(i=0;i<5;i++)
   {
     printf("\n%d\t%s\t%c\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",i,UFD[U][i].filename,UFD[U][i].access,UFD[U][i].length,UFD[U][i].flag,UFD[U][i].address[0],UFD[U][i].address[1],UFD[U][i].address[2],UFD[U][i].address[3],UFD[U][i].address[4]);
   }
}

void print_UOF()
{ 
   int i;
   printf("num   filename access length  flag   write  cre_clo.\n ");
   for(i=0;i<5;i++)
   {
     printf("\n%d\t%s\t%c\t%d\t%d\t%d\t%d\n",i,UOF[i].filename,UOF[i].access,UOF[i].length,UOF[i].flag,UOF[i].write,UOF[i].cre_clo);
   }
}

main()
{
    char  name[20];    
    char  na[20];
    int i,a;
    printf("-------欢迎进入文件系统-------\n");
    printf("\n请输入用户名。\n") ;
    scanf("%s",name);  
    getchar();
    for(i=0;i<N;i++)
    {
      if(strcmp(MFD[i],name)==0)
      {
          U=i;
          while(1)
          {
             printf("\n------------欢迎使用-------------\n");
             printf("----1:创建文件。            ----\n");
             printf("----2:打开文件。            ----\n");
			 printf("----3:读文件。              ----\n");
             printf("----4:写文件。              ----\n");
             printf("----5:关闭文件。            ----\n");
			 printf("----6:撤销文件。            ----\n");
             printf("----7:打印显示UFD。         ----\n");
             printf("----8:打印显示UOF。         ----\n");
             printf("----9:重新选择用户。        ----\n");
             printf("----0:退出。                ----\n");
             printf("--------------------------------\n");
             printf("\n请输入你的选择。(0-9)\n");
             scanf("%d",&a);
             switch(a)
             {   
                case 1: creat(); 
                break;
                case 2: open();
                break;
                case 3: printf("请输入你要读的文件。\n");
                        scanf("%s",na);
                        read(na);
				        break;
				case 4: write();
				break;
                case 5: printf("请输入你要写的文件。\n");
					    scanf("%s",na);
                        close(na);
                        break; 
                case 6: printf("请输入你要撤销的文件。\n");
                        scanf("%s",na);
                        del(na);
                        break;
				case 7: print_UFD();
                break;
				case 8: print_UOF();
                break;
                case 9: return main();
                break;
                case 0: exit(0);
                default: printf("指令错误!/n");
                         return main();
                break;
            }
          }
      }
    }
     if(i==N)
     printf("\n用户不存在。\n") ;
     return main();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -