求助!C/C++编写文件管理系统
文件管理系统
1.设计内容:
模拟一个简单的文件管理系统。实现下列功能:
1)建立文件
2)打开文件
3)关闭文件
4)删除文件
5)建立目录
6)显示目录内容
2.设计思路:
以一个真实的文件来模拟一块磁盘。
1)需自行定义的数据结构有:
a.目录结构
typedef struct
{
char name[3]; /*文件或目录名*/
char type[2]; /*文件类型名*/
char attribute; /*属性*/
char address; /*文件或目录的起始盘块号*/
char length; /*文件长度,以盘块为单位*/
}content; /*目录结构*/
b.已打开文件表的读写指针结构
typedef struct
{
int dnum; /*磁盘盘块号*/
int bnum; /*盘块内第几项*/
}pointer; /*已打开文件表中读写指针的结构*/
c.已打开文件表表项结构定义
typedef struct
{
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",打开时为文件末尾*/
}OFILE; /*已打开文件表项类型定义*/
d.已打开文件表定义
struct
{
OFILE file[n]; /*已打开文件表*/
int length; /*已打开文件表中登记的文件数量*/
}openfile; /*已打开文件表定义*/
char buffer1[64];/*模拟缓冲1*/ //模拟磁盘上的物理块中存放的具体数据
content buffer2[8];/*模拟缓冲2*/ //模拟磁盘上的物理块中存放的目录
FILE *fc; /*模拟磁盘的文件指针*/
2)需要设计的函数:
a.
sopen(char *name) 在已打开文件表中查找文件name
b.
dopen(char *name) 在已打开文件表中删除文件name
c. iopen(content *x) 在已打开文件表openfile数组中插入文件name
d. allocate( ) 分配一个磁盘块,返回块号。从FAT中依次查找,找到一个空闲的磁盘区,返回它的编号
e. search(char *name,int flag,int *dnum,int *bnum) 查找路径名为name的文件或目录,返回该目录的起始盘块号
f. create_file(char *name,int attribute)
g. open_file(char *name,int attribute)
h. close_file(char *name)
i. delete(char *name)
j. md(char *name)
k. dir(char *name)
答案:#include "stdio.h"
#include "stdlib.h"
#include "string.h"
//主文件结构体
struct MasterFile{
char username[20];
//用户名
char password[20];
//用户名密码
char flag;
//标志
struct MasterFile *next;
};
//用户文件结构体
struct UserFile{
int fnum;
//文件编号
char fname[20]; //文件名
int flength;
//文件长度
char flag;
//标志
char fpw[20];
//文件保护码
struct UserFile *link;
};
//全局变量
int shoudsave; //存储标记
int usingnum;
//当前用户标记
struct MasterFile MFD[20];
//主目录
struct UserFile UFD[20][20]; //用户目录
//寻找主目录空闲区
struct MasterFile*MoveMFDToLast(){
for(int i=0;i<20;i++){
if(MFD[i].flag==0)
usingnum=i;
return &MFD[i];
}
return NULL;
}
//查找用户
struct MasterFile*SearchMFD(char str[]){
for(int i=0;i<20;i++){
if(strcmp(str,MFD[i].username)==0){
usingnum=i;
return &MFD[i];
}
}
return NULL;
}
//寻找用户目录空闲区
struct UserFile *MoveUFDToLast(){
for(int i=0;i<20;i++){
if(UFD[usingnum][i].flag==0)
return &UFD[usingnum][i];
}
return NULL;
}
//查找用户文件
struct UserFile *SearchUFD(int num){
for(int i=0;i<20;i++){
if(UFD[usingnum][i].fnum==num)
return &UFD[usingnum][i];
}
return NULL;
}
//删除用户文件目录
void LeftMoveUFD(int num){
for(int i=0;i<20;i++){
if(UFD[usingnum][i].fnum==num){
for(int j=i;j<19;j++){
UFD[usingnum][i].flag=UFD[usingnum][i+1].flag;
UFD[usingnum][i].flength=UFD[usingnum][i+1].flength;
strcpy(UFD[usingnum][i].fname,UFD[usingnum][i+1].fname);
UFD[usingnum][i].fnum=UFD[usingnum][i+1].fnum;
strcpy(UFD[usingnum][i].fpw,UFD[usingnum][i+1].fpw);
UFD[usingnum][i].link=UFD[usingnum][i+1].link;
}
}
}
}
//用户登陆
void Login(){
char flag1,flag2,flag3;
char str1[20],str2[20],str3[20],str4[20];
struct MasterFile *p;
printf("你是已有用户吗(y/n)?");
scanf("%s",&flag1);
if(flag1=='n'){
//新用户登录
printf("请创建新的用户:(y/n)");
scanf("%s",&flag2);
if(flag2=='n'){
printf("你已退出了系统!\n");
exit(1);
}else{
printf("请输入你的用户名:");
scanf("%s",&str1);
printf("请输入口令:");
scanf("%s",&str2);
p=MoveMFDToLast();
strcpy(p->username,str1);
strcpy(p->password,str2);
p->flag=1;
printf("%d",MFD[usingnum].flag);
p->next=NULL;
shoudsave=1;
//存储标记
}
}else{
//旧用户登录
while(1){
printf("请输入你的用户名:");
//输入用户名
scanf("%s",&str3);
p=SearchMFD(str3);
if(p==NULL){
printf("对不起,你输入的用户名不存在!\n");
printf("继续(y)还是放弃(n)?");
scanf("%s",&flag3);
if(flag3=='y') continue;
else{
printf("你已退出了系统!\n");
exit(1);
}
}else{
while(1){
printf("请输入口令:");
//输入口令
scanf("%s",&str4);
if(strcmp(str4,p->password)!=0){
printf("对不起,你输入的口令不正确,请重新输入.\n");
continue;
}else break;
}
}break;
}
}
}
//菜单
void menu(){
printf("\n********************************************************************************");
printf("\t1列文件目录
上一个:如何用C++实现本学院学生成绩管理系统
下一个:C++中得struct timeval如何转换成C#