#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_COL_SIZE 20 //定义最大的列大小

int disk_bitmap[MAX_COL_SIZE][MAX_COL_SIZE] = {0}; //定义位示图

struct file_allocation_table { char file_name[50]; int blocks[MAX_COL_SIZEMAX_COL_SIZE]; int block_num; } file_table[MAX_COL_SIZEMAX_COL_SIZE];

void init_diks_bitmap() { //初始化位示图 int i, j; for (i = 0; i < MAX_COL_SIZE; i++) { for (j = 0; j < MAX_COL_SIZE; j++) { disk_bitmap[i][j] = 0; } } }

void display_file_table() { //显示文件分配表中的内容 int i, j; printf("文件名\t所占磁盘块号\n"); for (i = 0; i < MAX_COL_SIZE*MAX_COL_SIZE; i++) { if (file_table[i].block_num > 0) { printf("%s\t", file_table[i].file_name); for (j = 0; j < file_table[i].block_num; j++) { printf("%d ", file_table[i].blocks[j]); } printf("\n"); } } }

int find_continuous_blocks(int block_num) { //查找连续的空闲磁盘块 int i, j; int count = 0; for (i = 0; i < MAX_COL_SIZE; i++) { for (j = 0; j < MAX_COL_SIZE; j++) { if (disk_bitmap[i][j] == 0) { count++; if (count == block_num) { return j + 1 - block_num; } } else { count = 0; } } count = 0; } return -1; //未找到连续的空闲磁盘块 }

void allocate_continuous_blocks(char* file_name, int block_num) { //连续分配磁盘块 int i, j; int start = find_continuous_blocks(block_num); if (start == -1) { printf("连续的空闲磁盘块不足%d个,分配失败\n", block_num); return; } for (i = 0; i < block_num; i++) { disk_bitmap[start/20][start%20 + i] = 1; }

//记录到文件分配表中
for (i = 0; i < MAX_COL_SIZE*MAX_COL_SIZE; i++) {
    if (file_table[i].block_num == 0) {
        strcpy(file_table[i].file_name, file_name);
        int start_block = start/20*MAX_COL_SIZE + start%20;
        for (j = 0; j < block_num; j++) {
            file_table[i].blocks[j] = start_block + j;
        }
        file_table[i].block_num = block_num;
        break;
    }
}
printf("成功将文件%s分配到%d-%d号磁盘块\n", file_name, start, start + block_num - 1);

}

void allocate_discontinuous_blocks(char* file_name, int* block_list, int block_num) { //离散分配磁盘块 int i; for (i = 0; i < block_num; i++) { if (disk_bitmap[(block_list[i]-1)/20][(block_list[i]-1)%20] == 1) { printf("磁盘块%d已被占用,分配失败\n", block_list[i]); return; } else { disk_bitmap[(block_list[i]-1)/20][(block_list[i]-1)%20] = 1; } }

//记录到文件分配表中
for (i = 0; i < MAX_COL_SIZE*MAX_COL_SIZE; i++) {
    if (file_table[i].block_num == 0) {
        strcpy(file_table[i].file_name, file_name);
        memcpy(file_table[i].blocks, block_list, block_num*sizeof(int));
        file_table[i].block_num = block_num;
        break;
    }
}
printf("成功将文件%s分配到磁盘块", file_name);
for(i = 0; i < block_num; i++) {
    printf("%d ", block_list[i]);
}
printf("\n");

}

void free_blocks(int* block_list, int block_num) { //释放磁盘块 int i; for (i = 0; i < block_num; i++) { disk_bitmap[(block_list[i]-1)/20][(block_list[i]-1)%20] = 0; }

//从文件分配表中删除
for (i = 0; i < MAX_COL_SIZE*MAX_COL_SIZE; i++) {
    if (file_table[i].block_num > 0 && memcmp(file_table[i].blocks, block_list, block_num*sizeof(int)) == 0) {
        memset(&file_table[i], 0, sizeof(struct file_allocation_table));
        break;
    }
}
printf("成功回收磁盘块");
for(i = 0; i < block_num; i++) {
    printf("%d ", block_list[i]);
}
printf("\n");

}

int main() { int i, j, select, block_num; char file_name[50]; int block_list[MAX_COL_SIZE*MAX_COL_SIZE];

init_diks_bitmap();  //初始化磁盘位示图

while (1) {
    printf("\n请选择要执行的操作:\n");
    printf("1. 查看位示图\n");
    printf("2. 连续分配磁盘块\n");
    printf("3. 离散分配磁盘块\n");
    printf("4. 分配文件\n");
    printf("5. 回收文件\n");
    printf("6. 查看文件分配表\n");
    printf("7. 退出程序\n");
    scanf("%d", &select);

    switch (select) {
        case 1:
            printf("\n位示图:\n");
            for (i = 0; i < MAX_COL_SIZE; i++) {
                for (j = 0; j < MAX_COL_SIZE; j++) {
                    printf("%d ", disk_bitmap[i][j]);
                }
                printf("\n");
            }
            break;
        case 2:
            printf("\n请输入要分配的磁盘块数量:");
            scanf("%d", &block_num);
            allocate_continuous_blocks("未命名文件", block_num);
            break;
        case 3:
            printf("\n请输入要分配的磁盘块号列表(以-1结尾):");
            block_num = 0;
            while (1) {
                scanf("%d", &block_list[block_num]);
                if (block_list[block_num] == -1) {
                    break;
                }
                block_num++;
            }
            allocate_discontinuous_blocks("未命名文件", block_list, block_num);
            break;
        case 4:
            printf("\n请输入要分配的文件名:");
            scanf("%s", file_name);
            printf("1. 连续分配磁盘块\n");
            printf("2. 离散分配磁盘块\n");
            scanf("%d", &select);
            switch(select) {
                case 1:
                    printf("\n请输入要分配的磁盘块数量:");
                    scanf("%d", &block_num);
                    allocate_continuous_blocks(file_name, block_num);
                    break;
                case 2:
                    printf("\n请输入要分配的磁盘块号列表(以-1结尾):");
                    block_num = 0;
                    while (1) {
                        scanf("%d", &block_list[block_num]);
                        if (block_list[block_num] == -1) {
                            break;
                        }
                        block_num++;
                    }
                    allocate_discontinuous_blocks(file_name, block_list, block_num);
                    break;
                default:
                    printf("无效的输入\n");
                    break;
            }
            break;
        case 5:
            printf("\n请输入要回收的文件名:");
            scanf("%s", file_name);
            for (i = 0; i < MAX_COL_SIZE*MAX_COL_SIZE; i++) {
                if (file_table[i].block_num > 0 && strcmp(file_table[i].file_name, file_name) == 0) {
                    free_blocks(file_table[i].blocks, file_table[i].block_num);
                    break;
                }
            }
            if (i == MAX_COL_SIZE*MAX_COL_SIZE) {
                printf("未找到文件%s\n", file_name);
            }
            break;
        case 6:
            printf("\n文件分配表:\n");
            display_file_table();
            break;
        case 7:
            printf("程序已退出\n");
            exit(0);
        default:
            printf("无效的输入\n");
            break;
    }
}

return 0;

}

// 离散分配磁盘块的过程: // 1. 输入要分配的磁盘块号列表(以-1结尾) // 2. 检查每个磁盘块是否已被占用,如果有任何一个已被占用,则分配失败 // 3. 将每个磁盘块标记为已占用 // 4. 将文件名和磁盘块号列表记录到文件分配表中

// 连续分配磁盘块的过程: // 1. 输入要分配的磁盘块数量 // 2. 查找连续的空闲磁盘块,如果找到,则分配成功;如果找不到,则分配失败 // 3. 将每个磁盘块标记为已占用 // 4. 将文件名和磁盘块号列表记录到文件分配表中

// 回收磁盘块的过程: // 1. 输入要回收的文件名 // 2. 在文件分配表中查找该文件名对应的磁盘块号列表 // 3. 将每个磁盘块标记为未占用 // 4. 从文件分配表中删除该文件的记录

C语言磁盘空间管理系统 - 连续分配与离散分配

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

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