实验六文件存储空间管理模拟--位示图:连续分配与离散分配实现
/*
- *@author:飞小飞
- *@date:2018年11月23日 10:33
- *@目的:1配与回收,在本程序中位示图 i = 0, j = 0, b = 0;开始
- 采用离散存储和连续存储两种方式
- *功能实现:1.分配空间给文件 2.回收文件的空间 3.查看所有文件存储信息
- *联系作者:1511225190@qq.com
*/
#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; / 文件存储时 的初始位置 / int blockList; /* 文件占用的块号 / int blockNum; / 文件占用的块数 */ }file;
file File[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; printf( "%3d", map[i][j] ); } printf( "\n" ); } }
/*
- *函数名:allocContiguous(int fileNum)
- *描述: 采用连续分配方式,给文件分配空间
- *参数: fileNum 第几个文件
- *返回值: 无 */ void allocContiguous( int fileNum ) { int length = File[fileNum].length; int i, j, k; int start = -1; for ( i = 0; i < line; i++ ) { for ( j = 0; j < column; j++ ) { if ( map[i][j] == 0 ) { start = i * column + j; for ( k = 1; k < length; k++ ) { if ( j + k >= column || map[i][j + k] != 0 ) { start = -1; break; } } if ( start != -1 ) break; } } if ( start != -1 ) break; } if ( start == -1 ) printf( "空间不足,无法分配\n" ); else{ File[fileNum].start = start; File[fileNum].blockList = new int[length]; File[fileNum].blockNum = length; for ( i = 0; i < length; i++ ) { int x1 = ( start + i ) / column; int y1 = ( start + i ) % column; map[x1][y1] = 1; / 置1 代表使用 过 */ File[fileNum].blockList[i] = start + i; } } for ( i = 0; i < line; i++ ) { for ( j = 0; j < column; j++ ) { printf( "%3d", map[i][j] ); } printf( "\n" ); } }
/*
- *函数名:allocDiscrete(int fileNum)
- *描述: 采用离散分配方式,给文件分配空间
- *参数: fileNum 第几个文件
- *返回值: 无 */ void allocDiscrete( int fileNum ) { int length = File[fileNum].length; int i, j, k; int cnt = 0; File[fileNum].start = -1; File[fileNum].blockList = new int[length]; File[fileNum].blockNum = 0; for ( i = 0; i < line; i++ ) { for ( j = 0; j < column; j++ ) { if ( map[i][j] == 0 ) { File[fileNum].blockList[cnt++] = i * column + j; File[fileNum].blockNum++; if ( cnt == length ) break; } } if ( cnt == length ) break; } if ( cnt != length ) { printf( "空间不足,无法分配\n" ); } else{ File[fileNum].start = File[fileNum].blockList[0]; for ( i = 0; i < length; i++ ) { int x1 = File[fileNum].blockList[i] / column; int y1 = File[fileNum].blockList[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(char s[])
- *描述: 通过文件名回收文件占用空间,并将位示图中对应标志位重新初始化为0
- *参数: char 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 blockList = File[cnt].blockList; int blockNum = File[cnt].blockNum; for ( int i = 0; i < blockNum; i++ ) { int x1 = blockList[i] / column; int y1 = blockList[i] % column; map[x1][y1] = 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; File[i - 1].blockList = File[i].blockList; File[i - 1].blockNum = File[i].blockNum; } 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 ); int allocType; printf( "请选择分配方式:1.连续分配 2.离散分配\n" ); scanf( "%d", &allocType ); switch ( allocType ) { case 1: allocContiguous( fileTotalNum ); break; case 2: allocDiscrete( fileTotalNum ); break; default: printf( "不存在该分配方式,请重新输入\n" ); break; } fileTotalNum++; }
/*
- *函数名: recoverInit()
- *描述: 回收初始化
- *参数: 无
- *返回值: 无 **/ void recoverInit() { char name[30]; printf( "请输入回收文件名\n" ); scanf( "%s", &name ); recovery( name ); fileTotalNum--; }
/*
- *函数名: 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 ); printf( "文件占用的块号:" ); for ( int j = 0; j < File[i].blockNum; j++ ) { printf( "%d ", File[i].blockList[j] ); } printf( "\n" ); } for ( int i = 0; i < line; i++ ) { for ( int j = 0; j < column; j++ ) { printf( "%3d", map[i][j] ); } printf( "\n" ); } }
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; } } }
原文地址: https://www.cveoy.top/t/topic/owH3 著作权归作者所有。请勿转载和采集!