#include #include <string.h> //用于字符串操作 #include <stdlib.h> #include <stdio.h> using namespace std;

int map[100][100]; //位示图,用于记录磁盘块的使用情况

typedef struct file //定义文件结构体 { char fileName[30]; /* 文件名字 / int length; / 文件长度 / int start; / 文件存储时 的初始位置 */ } file;

file File[60]; //定义文件数组,最多可以存储60个文件 int line, column; /* 行 列 / int fileTotalNum = 0; / 总文件数 */

/*

  • *函数名:mapInit()
  • *描述: 对位示图进行初始化
  • *参数: 无
  • *返回值: 无 **/ void mapInit() { int i, j; printf("请输入行和列:"); scanf("%d%d", &line, &column); for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { map[i][j] = 0; //初始化位示图,全部赋值为0,表示未使用 printf("%3d", map[i][j]); } printf("\n"); } }

/*

  • *函数名:allocation()
  • *描述: 分配磁盘块给文件存储
  • *参数: fileNum,文件编号
  • *返回值: 无 **/ void allocation(int fileNum) { int length = File[fileNum].length; //获取文件长度 int b[60]; //定义一个数组,用于存储磁盘块的位置 int i, j; int x = 0; //用于记录数组b的下标 for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { if (map[i][j] == 0) //如果该磁盘块未被使用 { b[x] = i * line + j; //将该磁盘块的位置存储在数组b中 x++; if (x == length) //如果数组b已经存满了文件,跳出内部循环 break; } else x = 0; //如果该磁盘块已被使用,将数组b的下标重置为0 } if (x == length) //如果数组b已经存满了文件,跳出外部循环 break; } if (length > x) //如果文件所需的磁盘块数量大于可用的磁盘块数量 printf("空间不足,无法分配\n"); else { File[fileNum].start = b[0]; //将文件的起始位置设置为数组b中第一个磁盘块的位置 for (int i = 0; i < x; i++) { int x1 = b[i] / column; //将磁盘块的位置转换为行列坐标 int y1 = b[i] % column; map[x1][y1] = 1; //将该磁盘块的状态置为1,表示已被使用 } } for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { printf("%3d", map[i][j]); //输出更新后的位示图 } printf("\n"); } }

/*

  • *函数名:recovery()
  • *描述: 回收文件占用的磁盘块
  • *参数: s,要回收的文件名
  • *返回值: 无 **/ void recovery(char s[]) { int cnt = -1; //用于记录要回收的文件在文件数组中的下标 for (int i = 0; i < fileTotalNum; i++) { if (strcmp(s, File[i].fileName) == 0) //如果找到了要回收的文件 { cnt = i; break; } } if (cnt == -1) //如果未找到要回收的文件 { printf("没有此文件,请重新输入!\n"); } int start = File[cnt].start; //获取要回收的文件的起始位置 int length = File[cnt].length; //获取要回收的文件的长度 for (int i = start; i < start + length; i++) { int x1 = i / column; //将磁盘块的位置转换为行列坐标 int y1 = i % column; map[x1][y1] = 0; //将该磁盘块的状态置为0,表示未被使用 } for (int i = cnt + 1; i < fileTotalNum; i++) //将文件数组中该文件后面的文件向前移动,覆盖该文件 { strcpy(File[i - 1].fileName, File[i].fileName); File[i - 1].start = File[i].start; File[i - 1].length = File[i].length; } printf("回收成功\n"); for (int i = 0; i < line; i++) { for (int j = 0; j < column; j++) { printf("%3d", map[i][j]); //输出更新后的位示图 } printf("\n"); } }

/*

  • *函数名:allocInit()
  • *描述: 创建文件,初始化文件结构体
  • *参数: 无
  • *返回值: 无 **/ void allocInit() { printf("请输入文件名\n"); scanf("%s", &File[fileTotalNum].fileName); printf("请输入文件长度\n"); scanf("%d", &File[fileTotalNum].length); allocation(fileTotalNum); //将文件占用的磁盘块分配出来 fileTotalNum++; //文件数量加1 }

/*

  • *函数名:recoverInit()
  • *描述: 回收文件,更新位示图和文件数组
  • *参数: 无
  • *返回值: 无 **/ void recoverInit() { char name[30]; //用于存储要回收的文件名 printf("请输入回收文件名\n"); scanf("%s", &name); recovery(name); //回收该文件占用的磁盘块 fileTotalNum--; //文件数量减1 }

/*

  • *函数名:showDir()
  • *描述: 显示所有文件信息和位示图
  • *参数: 无
  • *返回值: 无 **/ void showDir() { if (fileTotalNum == 0) //如果没有文件 printf("空文件\n"); else for (int i = 0; i < fileTotalNum; i++) { printf("文件名:%s\n", File[i].fileName); printf("开始位置:%d\n", File[i].start); printf("文件长度:%d\n", File[i].length); } for (int i = 0; i < line; i++) { for (int j = 0; j < column; j++) { printf("%3d", map[i][j]); //输出位示图 } printf("\n"); } }

/*

  • *函数名:page()
  • *描述: 显示操作菜单
  • *参数: 无
  • *返回值: 无 **/ void page() { printf("1为创建文件,2为回收文件,3为显示所有文件信息\n"); printf("请选择操作模式\n"); }

int main() { int mode; mapInit(); //初始化位示图 while (1) { page(); //显示操作菜单 scanf("%d", &mode); //获取用户选择的操作 switch (mode) { case 1: allocInit(); //创建文件 break; case 2: recoverInit(); //回收文件 break; case 3: showDir(); //显示所有文件信息 break; default: printf("不存在该操作,请重新输入\n"); break; } } }

C语言位示图实现文件存储管理系统

原文地址: https://www.cveoy.top/t/topic/olYX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录