文件操作例程,纯C++ 编写
可以看到程序运行的界面。
DOC环境运行,通过输入数值执行对应功能。
别人写的,就两个文件,内容如下。
可以参考使用。
- #include "stdio.h"
- #include "conio.h"
- #include "stdlib.h"
- #include <string.h>
- #define false 0
- #define true 1
- #define n 5 /*模拟实验中系统允许打开文件的最大数量*/
- class Content /*目录结构*/
- {
- public:
- char name[3]; /*文件或目录名*/
- char type[3]; /*文件类型名*/
- char attribute; /*属性*/
- char address; /*文件或目录的起始盘块号*/
- char length; /*文件长度,以盘块为单位*/
- };
- /*已打开文件表中读写指针的结构*/
- class Pointer
- {
- public:
- int dnum; /*磁盘盘块号*/
- int bnum; /*盘块内第几项*/
- };
- /*已打开文件表项类型定义*/
- class OFILE
- {
- public:
- char name[20]; /*文件绝对路径名*/
- char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/
- int number; /*文件起始盘块号*/
- int length; /*文件长度,文件占用的字节数*/
- int flag; /*操作类型,用"0"表示以读操作方式开文件,用"1"表示写操作方式打开文件*/
- Pointer read; /*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnum为"0"*/
- Pointer write; /*写文件的位置,文件建立时dnum为文件起始盘块号,bnum为"0",打开时为文件末尾*/
- };
- /*已打开文件表定义*/
- class OpenFile
- {
- public:
- OFILE file[n]; /*已打开文件表*/
- int length; /*已打开文件表中登记的文件数量*/
- };
- char buffer1[64];/*模拟缓冲1*/
- Content buffer2[8];/*模拟缓冲2*/
- FILE *fc; /*模拟磁盘的文件指针*/
复制代码- #include "FileSystem.h"
- Content content;
- Pointer ponter;
- OFILE ofile;
- OpenFile openfile;
- //文件操作
- /*查找路径名为name的文件或目录,返回该目录的起始盘块号 */
- int search(char name[],int flag,int *dnum,int *bnum)/*flag=8表示查找目录,否则为文件*//*返回找到文件或目录的目录项的位置:盘块dnum中第bnum项*/
- {
- int k,i,s,j,last=0;
- char pna[3],type[3];
- if((strcmp(name,"")==0)||(strcmp(name,"/")==0))/*根目录*/
- return(2);
- k=0;
- if(name[0]=='/')k=1;
- i=2; /*i=根目录的起始盘块号*/
- while(last!=1)
- {
- /*pna=从name中分离出"/"后一个目录名(或文件名)*/
- for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='\0';s++,k++)
- pna[s]=name[k];
- for(;s<3;s++)/*用空格补全名字长度*/
- pna[s]=' ';
- while(name[k]!='.'&&name[k]!='\0'&&name[k]!='/')/*除去多余字符*/
- k++;
- type[0]=type[1]=' ';
- if(name[k]=='.')/*取文件类型名type*/
- if(flag==8)
- {
- printf("Dir shouldn't contain file type,failed!\n\n");
- return(false);
- }
- else
- {/*文件遇到类型名认为结束,后面的字符作废*/
- k++;
- if(name[k]!='\0')
- type[0]=name[k];
- k++;
- if(name[k]!='\0')
- type[1]=name[k];
- k++;
- if(name[k]!='\0')
- type[2]=name[k];
-
- if(name[k]!='\0'&&name[k+1]!='\0')
- {
- printf("Wrong file name!\n\n");
- return(false);
- }
- last=1;
- }
- else
- if(name[k]!='\0')
- k++;
- if(name[k]=='\0')
- last=1;
- /*查找目录且名字等于pna的目录项*/
- fseek(fc,i*64L,SEEK_SET);
- fread(buffer2,64L,1,fc);
- j=0;
- if(last==1&&flag!=8)
- while(j<8&&!(buffer2[j].attribute!=8&&buffer2[j].name[0]==pna[0]&&
- buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2]&&
- buffer2[j].type[0]==type[0]&&buffer2[j].type[1]==type[1]&&buffer2[j].type[2]==type[2]))
- j++;
- else
- while(j<8&&!(buffer2[j].attribute==8&&buffer2[j].name[0]==pna[0]&&buffer2[j].name[1]==pna[1]
- &&buffer2[j].name[2]==pna[2]))
- j++;
- if(j<8)/*找到该目录或文件*/
- if(last==1)/*查找结束*/
- {
- *dnum=i;
- *bnum=j;
- return(buffer2[j].address);
- }
- else/*查找还未结束*/
- i=buffer2[j].address;/*读取下一个盘块*/
- else
- return(false);
- }/*while 查找结束*/
- return 1;
- }/*search()结束*/
- /*分配一个磁盘块,返回块号*/
- int allocate( )
- {
- int i;
- fseek(fc,0,SEEK_SET); /*将模拟磁盘的文件指针移至模拟磁盘FAT表*/
- fread(buffer1,64L,1,fc);/*将FAT表中第一个磁盘块读入模拟缓冲buffer1中*/
- for(i=3;i<63;i++)
- if(buffer1[i]==0)
- { /*FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘*/
- buffer1[i]=255;
- fseek(fc,0,SEEK_SET);
- fwrite (buffer1,64L,1,fc);
- return(i); /*返回磁盘号*/
- }
- fread(buffer1,64L,1,fc);/*将FAT表中第二个磁盘块读入模拟缓冲buffer1中*/
- for(i=0;i<63;i++)
- if(buffer1[i]==0)
- {/*FAT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写回磁盘*/
- buffer1[i]=255;
- fseek(fc,-64L,SEEK_CUR);
- fwrite(buffer1,64L,1,fc);
- return(i+64); /*返回磁盘号*/
- }
- printf("Disk full,please clear file system!\n\n");
- return(false);
- }
- /*分配磁盘块函数结束*/
- void copen(OFILE *x1,OFILE *x2)
- {
- strcpy(x1->name,x2->name);
- x1->attribute=x2->attribute;
- x1->number=x2->number;
- x1->length=x2->length;
- x1->flag=x2->flag;
- x1->read.dnum=x2->read.dnum;
- x1->read.bnum=x2->read.bnum;
- x1->write.dnum=x2->write.dnum;
- x1->write.bnum=x2->write.bnum;
- }
- /*在已打开文件表中查找文件name*/
- int sopen(char name[])
- {
- int i;
- i=0;
- while(i<openfile.length&&strcmp(openfile.file[i].name,name)!=0)/*依次查找已打开文件表*/
- i++;
- if(i>=openfile.length)
- return(-1);
- return(i);
- }/*查找sopen函数结束*/
- void dopen(char name[]) /*在已打开文件表中删除文件name*/
- {
- int i;
- i=sopen(name);
- if(i==-1)
- printf("You need to open that file first!\n\n");
- else
- {
- copen(&openfile.file[i],&openfile.file[openfile.length-1]);
- openfile.length--;
- }
- }/*删除函数结束*/
- /*在已打开文件表中插入文件name*/
- int iopen(OFILE *x)
- {
- int i;
- i=sopen(x->name);
- if(i!=-1)
- {
- printf("File is already open!\n\n");
- return(false);
- }
- else if(openfile.length==n)
- {
- printf("Table of open file is full!\n\n");
- return(false);
- }
- else
- {
- copen(&openfile.file[openfile.length],x);
- openfile.length++;
- return(true);
- }
- }
- /*填写已打开文件表函数结束*/
- /*建立文件函数,路径名name,文件属性attribute*/
- int create_file(char name[])
- {
- int i,j,k,s,d,t,b,dd,dn,bn;
- int attribute=4;
- char dname[3],tname[3],pathname[20];
- OFILE x;
- if(attribute%2==1)
- {
- printf("Read only,can't write!\n\n");
- return(false);
- }
- if(openfile.length==n)
- {
- printf("Table of open file is full,can't creat!\n\n");
- return(false);
- }
- /* 将name分成两部分,目录路径pathname和目录名dname*/
- for(j=0;name[j]!='\0';j++) /*查找最后一个“/”*/
- if(name[j]=='/')
- s=j;
- /*分离目录路径*/
- for(j=0;j<s;j++)
- pathname[j]=name[j];
- pathname[j]='\0';
- /*分离文件名*/
- for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++)
- dname[k]=name[j];
- if(k==0)
- {
- printf("Wrong file name or dir!\n\n");
- return(false);
- }
- for(;k<3;k++)
- dname[k]=' ';
- k=0;
-
- if(name[j++]=='.')/*分离类型名*/
- {
- for(;name[j]!='\0'&&k<5&&name[j]!='.';j++,k++)
- tname[k]=name[j];
- }
-
- for(;k<3;k++)
- tname[k]=' ';
- if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn和项数bn*/
- {
- printf("Dir isn't exist,can't creat!\n\n");
- return(false);
- }
- /*确认该目录不存在的同时查找空目录项*/
- b=-1;
-
- fseek(fc,d*64L,SEEK_SET);
- fread(buffer2,64L,1,fc); /*读出dnum盘块的内容*/
- for(t=0;t<8;t++)
- {
- if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]
- &&buffer2[t].type[0]==tname[0]&&buffer2[t].type[1]==tname[1]&&buffer2[t].type[2]==tname[2])
- { /*找到名字dname的文件,建立失败*/
- printf("Already exist,can't creat!\n\n");
- return(false);
- }
- if(buffer2[t].name[0]=='
文件操作例程,纯C++ 编写.rar
(13.31 KB, 下载次数: 0, 售价: 1 金币)
|