69,336
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#define MAX_USER_COUNT 10 // 一个至多为10个用户的文件系统
#define MAX_SAVED_FILE_COUNT 10 // 每次用户至多保存10个文件
#define MAX_OPEN_FILE_COUNT 5 // 一次运行用户至多可以打开5个文件
// 文件操作权限枚举
typedef enum
{
CanReadWrite=1, // 可进行读写执行操作
NoReadWrite = 0, // 不可进行读写执行操作
}Access;
//
//UFD用户文件目录
typedef struct
{
char fileName[40]; // 文件名
Access accessType; // 文件保护码
}FileDirectory;
typedef struct
{
FileDirectory file[MAX_SAVED_FILE_COUNT];
int length; // 用户文件目录的长度
}UserFileDirectory;
//
// MFD主目录结构
typedef struct
{
char userName[40]; // 用户名
UserFileDirectory *pUFD;// 指向该用户下的文件目录的首地址
}MainFileDirectory;
// AFD打开文件目录,即运行文件目录
typedef struct
{
char fileName[40]; // 打开的文件名
int type; // 文件的状态,1表示可以用,0表示已经删除
}AccessFileDirectory;
MainFileDirectory MFD[MAX_USER_COUNT];
AccessFileDirectory AFD[MAX_OPEN_FILE_COUNT];
UserFileDirectory UFD[MAX_SAVED_FILE_COUNT];
int afdCount = 0; // 当前已经打开的文件的个数
int mfdCount = 0;
int ufdIndex = 0;
void Init()
{
int i, j;
freopen("test.txt", "r", stdin);
for (i = 0; i < MAX_USER_COUNT; i++)
{
// 读入用户名
scanf("%s", MFD[i].userName);
// 读入该用户名下的文件目录信息
for (j = 0; j < MAX_SAVED_FILE_COUNT; j++)
{
scanf("%s%d", UFD[i].file[j].fileName, &UFD[i].file[j].accessType);
getchar();
}
getchar();
UFD[i].length = MAX_SAVED_FILE_COUNT;
MFD[i].pUFD = &UFD[i];
}
mfdCount = MAX_USER_COUNT;
fclose(stdin);
}
void InitAFD()
{
printf("输入要打开的文件名:\n");
scanf("%s", AFD[afdCount++].fileName);
}
void DisplayUFD(UserFileDirectory *pUFD)
{
int i = 0;
if (pUFD)
{
while (i < pUFD->length)
{
printf("文件名:%s 文件保护码:%d\n", pUFD->file[i].fileName, pUFD->file[i].accessType);
i++;
}
}
}
void Menu()
{
printf("\n*******************文件操作类型************************\n");
printf("* 1、Create文件 *\n");
printf("* 2、Delete文件 *\n");
printf("* 3、Open文件 *\n");
printf("* 4、Close文件 *\n");
printf("* 5、Read文件 *\n");
printf("* 6、Write文件 *\n");
printf("*******************************************************\n");
}
void Read()
{
char fileName[40];
int i;
printf("输入要读操作的文件名:\n");
scanf("%s", fileName);
for (i = 0; i < afdCount; i++)
{
if (strcmp(fileName, AFD[i].fileName) == 0)
{
break;
}
}
if (i >= afdCount || AFD[i].type == 0)
{
printf("文件名不存在或者文件尚未打开!\n");
}
else
{
printf("读操作成功!\n");
}
}
void Write()
{
char fileName[40];
int i;
printf("输入要执行写操作的文件名:\n");
scanf("%s", fileName);
for (i = 0; i < afdCount; i++)
{
if (strcmp(fileName, AFD[i].fileName) == 0)
{
break;
}
}
if (i >= afdCount || AFD[i].type == 0)
{
printf("文件名不存在或者文件尚未打开!\n");
}
else
{
printf("写操作成功!\n");
}
}
void Create()
{
char fileName[40];
printf("输入要创建的文件名:\n");
scanf("%s", fileName);
if (UFD[ufdIndex].length > MAX_SAVED_FILE_COUNT)
{
printf("目录文件已经满,不能再创建!\n");
}
else
{
strcpy(UFD[ufdIndex].file[UFD[ufdIndex].length++].fileName, fileName);
printf("创建成功!\n");
}
}
void Delete()
{
char fileName[40];
printf("输入要删除的文件名:\n");
scanf("%s", fileName);
if (UFD[ufdIndex].length <= 1)
{
UFD[ufdIndex].length = 0;
}
else
{
UFD[ufdIndex].length--;
}
printf("删除成功!\n");
}
void Open()
{
char fileName[40];
int i;
printf("输入要打开的文件名:\n");
scanf("%s", fileName);
i = 0;
while (strcmp(UFD[ufdIndex].file[i].fileName, fileName) != 0 && i < UFD[ufdIndex].length)
{
i++;
}
if (i >= UFD[ufdIndex].length)
{
printf("文件名不存在!\n");
}
else
{
if (UFD[ufdIndex].file[i].accessType == NoReadWrite) // 不可操作
{
printf("文件保护类型为不可读写,不能执行打开文件操作!\n");
}
else
{
printf("打开文件成功!\n");
strcpy(AFD[afdCount].fileName, fileName);
AFD[afdCount].type = 1;
}
}
}
void Close()
{
char fileName[40];
int i;
printf("输入要关闭的文件名:\n");
scanf("%s", fileName);
for (i = 0; i < afdCount; i++)
{
if (strcmp(fileName, AFD[i].fileName) == 0)
{
break;
}
}
if (i >= afdCount || AFD[i].type == 0)
{
printf("文件名不存在!\n");
}
else
{
AFD[i].type = 0;
printf("文件关闭成功!\n");
}
}
int main()
{
char userName[40];
int selection;
int i = 0;
int again;
printf("输入用户名:\n");
scanf("%s", userName);
Init();
fflush(stdin);//没有效果呢?
i = 0;
while (strcmp(MFD[i].userName, userName) != 0 && i < mfdCount)
{
i++;
}
if (i > mfdCount)
{
printf("用户不存在");
return 0;
}
ufdIndex = i;// 记录当前进入系统的用户下标
DisplayUFD(MFD[i].pUFD);
Menu();
do
{
fflush(stdin);
printf("输入操作编号:\n");
scanf("%d", &selection);
switch (selection)
{
case 1:Create();break;
case 2:Delete();break;
case 3:Open();break;
case 4:Close();break;
case 5:Read();break;
case 6:Write();break;
default:
printf("输入的操作编号不正确!\n");
}
printf("again?(1/0)\n");
scanf("%d", &again);
} while (again == 1);
return 0;
}
void Init()
{
int i, j;
freopen("test.txt", "r", stdin);
for (i = 0; i < MAX_USER_COUNT; i++)
{
// 读入用户名
scanf("%s", MFD[i].userName);
// 读入该用户名下的文件目录信息
for (j = 0; j < MAX_SAVED_FILE_COUNT; j++)
{
scanf("%s %d", UFD[i].file[j].fileName, &UFD[i].file[j].accessType);
}
UFD[i].length = MAX_SAVED_FILE_COUNT;
MFD[i].pUFD = &UFD[i];
}
mfdCount = MAX_USER_COUNT;
fclose(stdin);
freopen( "CON", "r", stdin);
}