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

📄 wj.cpp

📁 字符界面下实现的文件管理系统 用一个文件模拟磁盘操作
💻 CPP
字号:
#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列文件目录\t\t\t\t\t2创建文件\n"); 
printf("\t3删除文件\t\t\t\t\t4读文件\n"); 
printf("\t5写文件\t\t\t\t\t\t0退出系统\n"); 
printf("********************************************************************************\n"); 
} 
//列文件目录 
void Dir(){ 
if(MFD[usingnum].next==0) printf("目前你不存在任何文件!\n"); 
else{ 
for(int i=0;i<20;i++){ 
if(UFD[usingnum][i].flag==1) 
printf("文件编号\t%d\t文件名\t%s\t文件长度\t%d\t保护码\t%s\n",UFD[usingnum][i].fnum,UFD[usingnum][i].fname,UFD[usingnum][i].flength,UFD[usingnum][i].fpw); 
} 
} 
} 

//创建文件 
void Create(){ 
FILE *fp; 
int num; 
struct UserFile *f; 
char str1[20],str2[20]; 
printf("请输入你要创建的文件名:"); //输入文件信息 
scanf("%s",&str1); 
printf("请输入文件编号:"); 
scanf("%d",&num); 
printf("请输入文件保护码:"); 
scanf("%s",&str2); 
fp=fopen(str1,"w"); //创建文件 
f=MoveUFDToLast(); //寻找用户目录空闲区 
if(&UFD[usingnum][0]==f) //连接主目录 
MFD[usingnum].next=(struct MasterFile*)f; 
f->link=(struct UserFile*)fp; //设置用户目录 
MFD[usingnum].next=(struct MasterFile*)&UFD[usingnum][0]; 
strcpy(f->fname,str1); 
strcpy(f->fpw,str2); 
f->fnum=num; 
f->flength=0; 
f->flag=1; 
fclose(fp); 
shoudsave=1; //设置存储标记 
printf("文件已创建!\n"); 
} 
//删除文件 
void Delete(){ 
struct UserFile *f; 
int num; 
printf("请输入你要删除的文件编号:"); 
scanf("%d",&num); 
f=SearchUFD(num); //查找用户文件 
if(f==NULL) { 
printf("你要删除的文件不存在!\n"); 
}else{ 
LeftMoveUFD(num); //删除用户文件目录 
printf("文件已删除!\n"); 
} 
shoudsave=1; //设置存储标记 
} 
//读文件 
void Read(){ 
char ch; 
struct UserFile *f; 
FILE *fp; 
int num; 
printf("请输入你要读的文件的编号:"); 
scanf("%d",&num); 
f=SearchUFD(num); //查找文件 
if(f==NULL){ 
printf("你输入的文件不存在!\n"); 
}else{ 
if((fp=fopen(f->fname,"r"))==NULL){ //打开指定文件 
printf("不能打开该文件!\n"); 
exit(0); 
} 
} 
ch=fgetc(fp); //输出文件内容 
while(ch!=EOF){ 
putchar(ch); 
ch=fgetc(fp); 
} 
printf("\n"); 
fclose(fp); //关闭文件 
printf("文件已读完毕!\n"); 
} 
//写文件 
void Write(){ 
char ch; 
struct UserFile *f; 
FILE *fp; 
int num; 
printf("请输入你要写的文件的编号:"); 
scanf("%d",&num); 
f=SearchUFD(num); //查找文件 
if(f==NULL){ 
printf("你输入的文件不存在!\n"); 
}else{ 
if((fp=fopen(f->fname,"wr"))==NULL){ //打开指定文件 
printf("不能打开该文件!\n"); 
exit(0); 
} 
} 
printf("请按字符输入内容(以'#'表示结束符)"); //写入文件 
scanf("%s",&ch); 
while(ch!='#'){ 
fwrite(&ch,1,1,fp); 
scanf("%s",&ch); 
} 
fclose(fp); //关闭文件 
shoudsave=1; //设置存储标记 
printf("文件写入完毕!\n"); 
} 
//保存 
void Save(){ 
FILE *fpm,*fpu; 
int flag=1,count=0; 
fpm=fopen("F:\\MasterFile.txt","wb"); //打开主文件 
if(fpm==NULL){ 
printf("\n提示:重新打开主文件信息文件时发生错误!\n"); 
exit(1); 
} 
for(int i=0;i<20;i++) 
fwrite(&MFD[i],sizeof(struct MasterFile),1,fpm); //保存主文件目录信息 
fclose(fpm); 
printf("主文件目录信息保存完毕!\n"); 
fpu=fopen("F:\\UserFile.txt","wb"); //打开用户文件 
if(fpu==NULL){ 
printf("\n提示:重新打开用户目录信息文件时发生错误!\n"); 
exit(1); 
} 
for(int j=0;j<20;j++) //保存用户文件目录信息 
fwrite(&UFD[j],sizeof(struct UserFile),20,fpu); 
fclose(fpu); 
printf("用户文件目录信息保存完毕!\n"); 
} 


//主函数 
void main(){ 
FILE *fpm,*fpu; //文件指针 
int sel; 
char ch; 
char jian; 
printf("\t\t\t\t文件管理系统\n\t\t\t\t\n"); 
fpm=fopen("F:\\MasterFile.txt","rb"); //打开主文件目录信息文件 
if(fpm==NULL) { 
printf("\n提示:主文件目录信息文件还不存在,是否创建?(y/n)\n"); 
scanf("%s",&jian); 
if(jian=='y'||jian=='Y') 
fpm=fopen("F:\\MasterFile.txt","wb"); //创建主文件目录的文件 
else exit(0); 
} 
fpu=fopen("F:\\UserFile.txt","rb"); //打开用户文件目录信息文件 
if(fpu==NULL){ 
printf("\n提示:用户文件目录信息文件还不存在,是否创建?(y/n)\n"); 
scanf("%s",&jian); 
if(jian=='y'||jian=='Y') 
fpu=fopen("F:\\UserFile.txt","wb"); //创建用户文件目录的文件 
else exit(0); 
} 
printf("文件正在打开,请稍等..."); 
for(int i=0;i<20;i++) //读取主文件目录信息 
fread(&MFD[i],sizeof(struct MasterFile),1,fpm); //将文件的内容放入接点中 
fclose(fpm); // 关闭文件 
while(!feof(fpu)){ //读取用户目录文件信息 
for(int i=0;i<20;i++){ 
if(fread(&UFD[i][0],sizeof(struct UserFile),20,fpu)) //将文件的内容放入接点中 
MFD[i].next=(struct MasterFile*)&UFD[i][0]; 
} 
} 
fclose(fpu); //关闭文件 
printf("\n文件已导入完毕!\n"); 
Login(); //用户登录 
while(1) { //菜单操作 
menu(); 
printf("请你选择操作:"); 
scanf("%d",&sel); 
if(sel==0){ //保存文件信息 
if(shoudsave==1){ 
getchar(); 
printf("\n资料已经改动,是否将改动保存到文件中(y/n)?\n"); 
scanf("%c",&ch); 
if(ch=='y'||ch=='Y') 
Save(); 
} 
printf("\n你已经退出系统,再见!\n"); 
break; 
} 
switch(sel){ 
case 1:Dir();break; //列文件目录 
case 2:Create();break; //创建文件 
case 3:Delete();break; //删除文件 
case 4:Read();break; //读文件 
case 5:Write();break; //写文件 
default: printf("你输的选项有误,请重新输入!\n");break; 
} 
} 
}

⌨️ 快捷键说明

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