C语言文件分配模拟程序:位示图实现文件管理
#include
// 定义位示图,用于表示磁盘空间的使用情况 int map[100][100];
// 定义文件结构体,存储文件名、长度和起始位置 typedef struct file { char fileName[30]; /* 文件名字 / int length; / 文件长度 / int start; / 文件存储时的初始位置 */ }file;
// 定义文件数组和全局变量 file File[60]; int line, column; /* 行 列 / int fileTotalNum = 0; / 总文件数 */
/*
- *函数名:mapInit()
- *描述: 对位示图进行初始化
- *参数: 无
- *返回值: 无 **/ void mapInit() { int i, j; printf( "请输入行和列:" ); // 从控制台输入行数和列数 scanf( "%d%d", &line, &column ); // 初始化位示图,将所有位置都设置为 0,表示未被使用 for ( i = 0; i < line; i++ ) { for ( j = 0; j < column; j++ ) { map[i][j] = 0; printf( "%3d", map[i][j] ); } printf( "\n" ); } }
// 文件分配函数 void allocation( int fileNum ) { // 获取要分配的文件的长度 int length = File[fileNum].length; // 定义数组 b,用于存储分配的磁盘块索引 int b[60]; // 定义循环变量 int i, j; // 定义变量 x,用于记录已分配的磁盘块数量 int x = 0; // 遍历位示图,查找连续的空闲磁盘块 for ( i = 0; i < line; i++ ) { for ( j = 0; j < column; j++ ) { // 如果当前位置未被使用 if ( map[i][j] == 0 ) { // 将当前位置的索引存储到数组 b 中 b[x] = i * line + j; // 已分配的磁盘块数量加 1 x++; // 如果已分配的磁盘块数量等于文件长度,则跳出循环 if ( x == length ) break; /* 这个 break ,跳出 j 循环 / } else // 如果当前位置已被使用,则重置已分配的磁盘块数量 x = 0; } // 如果已分配的磁盘块数量等于文件长度,则跳出循环 if ( x == length ) break; / 这里 break, 跳出整个 for循环体 / } // 如果已分配的磁盘块数量小于文件长度,则表示磁盘空间不足,无法分配 if ( length > x ) printf( "空间不足,无法分配\n" ); else{ // 记录文件的起始位置 File[fileNum].start = b[0]; // 将分配的磁盘块标记为已使用 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" ); } }
// 文件回收函数 void recovery( char s[] ) { // 定义变量 cnt,用于记录要回收文件的索引 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; } // 删除文件,将后面的文件前移,覆盖原来文件 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 ); // 总文件数量加 1 fileTotalNum++; }
// 文件回收初始化函数 void recoverInit() { char name[30]; printf( "请输入回收文件名\n" ); // 从控制台输入要回收的文件名 scanf( "%s", &name ); // 调用文件回收函数 recovery( name ); // 总文件数量减 1 fileTotalNum--; }
// 显示文件信息函数 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" ); } }
// 显示操作菜单函数 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; } } }
// 每一行代码加注释,详细点,告诉我完整的内容:代码功能
// 这是一个简单的文件分配模拟程序,可以实现文件分配和回收功能。 // 程序中使用位示图来表示磁盘的使用情况,每个文件占用的磁盘块使用1表示,未被使用的磁盘块使用0表示。
// 程序流程:
// 1.初始化位示图,输入行和列数。 // 2.根据用户输入的文件名和长度,进行文件分配。从位示图中找到连续的未被使用的磁盘块,标记为已被使用,并记录文件的起始位置。 // 3.回收文件时,将文件占用的磁盘块标记为未被使用,并将文件从文件列表中删除。 // 4.显示所有文件的信息和位示图的使用情况。 // 5.循环执行以上操作,直到用户退出程序。
// 完整代码:
原文地址: https://www.cveoy.top/t/topic/olYR 著作权归作者所有。请勿转载和采集!