把文件的逻辑结构转换成存储结构,设计便于顺序存取和直接存取的文件存储结构

合集下载

黑工程操作系统复习题

黑工程操作系统复习题

1. LRU 页面调度算法总是选择在主存驻留时间最长的页面被淘汰。

()2. 磁盘是共享设备,所以每一时刻可有若干个进程同时与它交换信息。

()3. 分时系统中,时间片设置得越小,则平均响应时间越短。

()4. 多个进程可以对应于同一个程序,且一个进程也可能会执行多个程序。

()5. 设备独立性是指系统具有使用不同设备的能力。

()6. 进程A、B共享变量x,需要互斥执行;进程B C共享变量y, B、C也需要互斥执行,因此,进程A、C必须互斥执行。

()7. 为了提高系统资源的利用率,在作业调度的优先级算法中应该规定,计算型作业的优先级较高,I/O 型作业的优先级较低。

()8.I/0 交通管理程序的主要功能是管理主存控制器和通道。

()9. 引入缓冲区能使CPU和I/O设备之间速度不匹配的情况得到改善,但并不能减少设备中断CPU的次数。

()10. 由于设备驱动程序与硬件紧密相关,因此,系统中配备多少个设备就必须配置同样数量的设备驱动程序。

()11. 可以将操作系统看作是一个资源分配器,用来控制I/O 设备和用户的程序。

()12. 死锁的形成只与资源分配策略有关,而与并发进程的执行速度无关。

()13. 在引入线程的操作系统中,线程是资源分配和调度的基本单位。

()14. 分页存储管理方案易于实现用户使用内存空间的动态扩充。

()15. 对临界资源应采取互斥访问方式来实现共享。

()1. 错,原因: 是选择最长时间没有被用的页面被淘汰。

2. 错,原因: 每一时刻只有一个进程与它交换信息。

3. 错,原因:平均响应时间不但与时间片的大小有关,还与其他因素有关。

4. 对5. 错,原因:设备独立性,可使应用程序独立于具体的物理设备和独立于设备的类型6. 错,原因:不传递。

7. 错,原因:I/O 型作业的优先级高。

8. 错,原因:I/O 交通管理程序的主要功能是管理设备、控制器和通道。

9. 错,减少设备中断CPU的次数。

10. 错,一类一种。

计算机操作系统第八章

计算机操作系统第八章

将每一组含有的盘块数和该组所有的盘块号,记入前一组的第一个盘块的S.free[0]~S.free[99]中。这样,各组的第一个盘块就链接成一个链表。
将第一组的盘块总数和所有的盘块号,记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。
1
2
3
4
UNIX空闲盘块的组织
文件目录是一种数据结构,由若干目录项组成,每个目录项对应其中一个文件的FCB(包括文件名、文件体的物理地址、存取控制信息等),文件体另外存放。文件目录是用于检索文件的,一般的,目录项应包括以下内容:
整个系统只设一张文件目录表,集中存放文件存储器上所有文件的FCB,这是最简单的一种目录结构。目录表存于外存中的某块固定区域,系统初启或需要时调入内存,每个文件的FCB对应目录表中的一项,通过目录表就可以管理该系统中的所有文件,包括对文件的创建、检索和删除等。
两级文件目录
把登记文件的目录分成两级:主文件目录MFD,和用户文件目录UFD 。系统为每个用户各设置一个UFD,登记本用户所有文件的信息,每个UFD相当于一个一级目录;系统再设置一个MFD,用来登记所有用户的用户名及其UFD在外存上的物理地址、长度,物理结构等属性。
01
记录式文件,在逻辑上可看成是一组记录的集合。每个记录由彼此相关的若干个数据项组成。记录式文件中的逻辑记录可依次编号,其序号称为逻辑记录号(简称记录号)。
02
文件逻辑结构
按照文件的逻辑地址顺序存取。在记录式文件中,这种操作体现为按照记录的排列顺序来进行存取。
01
文件的随机存取 随机存取是指允许用户按照记录编号或者某一数据项的值随机存取存取任一记录。
二级索引存储结构
将索引表离散存储,即将索引表本身分为若干个逻辑块,存储在若干物理盘块中,将索引表所占的各盘块号记入另一个索引表——索引表的索引表。这种结构就称两级索引结构。

考研操作系统-文件管理(二)_真题-无答案

考研操作系统-文件管理(二)_真题-无答案

考研操作系统-文件管理(二)(总分100,考试时间90分钟)一、单项选择题1. 文件系统的主要目的______。

A.实现对文件的按名存取 B.实现虚拟存储C.提高外存的读写速度 D.用于存储系统文件2. 下列关于索引表的叙述中,正确的是______。

A.建立索引表的目的之一是为了减少存储空间B.索引表中含有索引文件的数据及其物理地址C.对索引文件存取时,必须先查找索引表D.索引表中每个记录的索引项可以有多个3. 从用户角度看,文件系统主要是实现______。

A.文件保护 B.文件保密 C.文件共享 D.按名存取4. 打开文件的具体含义是______。

A.在指定的磁盘地址上建立一个文件B.将指定的文件目录内容复制到主存的活动文件表中C.撤销指定文件的目录D.修改指定文件的内容5. ______具有将文件名转换为该文件在外存的物理位置的功能,这也正是文件目录所提供的最基本的功能。

A.文件目录 B.一级目录 C.二级目录 D.树形目录6. 文件的顺序存取是______。

A.按终端号依次存取 B.按文件的逻辑号逐一存取C.按物理块号依次存取 D.按文件逻辑记录的大小逐一存取7. 为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为______。

A.文件逻辑结构 B.文件物理结构 C.文件的属性 D.文件控制块(FCB)8. 设置当前目录的主要原因是______。

A.节省主存空间 B.加快文件查找速度 C.节省辅存空间 D.便于打开文件9. 文件信息的逻辑块号到物理块号的变换方法也是由文件的______决定的。

A.逻辑结构. B.顺序结构 C.物理结构 D.索引结构10. 为了防止各种意外可能破坏文件,文件系统可以采用______的方法来保护文件。

A.口令和加密 B.对每个文件规定使用权限C.建立副本和定时转储 D.为文件设置口令11. 建立多级目录______。

A.便于文件的保护 B.便于关闭文件 C.解决文件的重名与共享 D.提高系统的效率12. 文件路径名是指______。

韶关学院计算机系《操作系统》复习题(含答案)(1)

韶关学院计算机系《操作系统》复习题(含答案)(1)

韶关学院计算机系《操作系统》复习一、单项选择题(本大题共30小题,每小题1分,共30分)(在每小题列的四个选项中只有一个选项符合题目要求,请将正确选项的字母填在题后的空括号内,错选、不选不得分。

)1.文件系统中路径名由(C)组成。

A)磁盘符和目录名B)目录名和文件名C)磁盘符、目录结构和各个目录名、文件名D)磁盘符、根目录、文件名2.下面关于计算机系统和操作系统的叙述中,错误的是(A)。

A)操作系统是独立于计算机系统的,它不属于计算机系统。

B)计算机系统是一个资源集合体,包括软件资源和硬件资源。

C)操作系统是一个软件。

D)计算机硬件是操作系统赖以工作的实体,操作系统的运行离不开计算机硬件的支持3.进程具有三种基本状态:阻塞态、运行态、就绪态,进程在执行过程中,其状态总是不停地发生变化的,下面关于进程状态变化的说法中正确的是(D)A)一个进程必须经过进程的三个基本状态才能结束B)进程一旦形成,首先进入的是运行状态C)三种进程状态是进程运行过程中的基本状态,进程轲能同时处于某几种状态中D)在分时系统中,一个正在运行进程的时间片如果终结,该进程将转入就绪状态4.SPOOLing系统中,负责将数据从输入井读到正在执行的作业中的是(D)A)预输入程序B)缓输出程序C)输入井写程序D)输入井读程序5.下述作业调度算法中,与作业的估计运行时间有关的调度算法是(B)。

A)先来先服务 B)短作业优先 C)时间片轮转法D)均衡6.在作业调度算法中,既考虑作业等待时间,又考虑作业执行时间的调度算法是(D)。

A)先来先服务 B)短作业优先 C)时间片轮转法D)响应比高者优先7.从作业提交给系统到作业完成的时间间隔为作业的(C)。

A)中断时间 B)等待时间 C)周转时间D)响应时间8.作业的周转时间为(A)。

A)作业完成时间–作业提交时间B)作业开始时间 + 作业执行时间C)作业等待时间D)作业执行时间9.用户程序向系统提出使用外设的请求方式是(C)。

操作系统原理-第八章 文件系统习题(有答案)

操作系统原理-第八章  文件系统习题(有答案)

第六章文件系统6.3习题6.3.1 单项选择题1.操作系统对文件实行统一管理,最基本的是为用户提供( )功能。

A.按名存取 B.文件共享 C.文件保护 D.提高文件的存取速度2.按文件用途分类,编译程序是( )。

A.系统文件 B.库文件 C.用户文件 D.档案文件3.( )是指将信息加工形成具有保留价值的文件。

A.库文件 B.档案文件 C.系统文件 D.临时文件4.把一个文件保存在多个卷上称为( )。

A.单文件卷 B.多文件卷 C.多卷文件 D.多卷多文件5.采取哪种文件存取方式,主要取决于( )。

A.用户的使用要求 B.存储介质的特性C.用户的使用要求和存储介质的特性 D.文件的逻辑结构6.文件系统的按名存取主要是通过( )实现的。

A.存储空间管理 B.目录管理 C.文件安全性管理 D.文件读写管理7.文件管理实际上是对( )的管理。

A.主存空间 B.辅助存储空间 C.逻辑地址空间 D.物理地址空间8.如果文件系统中有两个文件重名,不应采用( )结构。

A.一级目录 B.二级目录 C.树形目录 D.一级目录和二级目录9.树形目录中的主文件目录称为( )。

A.父目录 B.子目录 C.根目录 D.用户文件目录10.绝对路径是从( )开始跟随的一条指向制定文件的路径。

A.用户文件目录 B.根目录 C.当前目录 D.父目录11.逻辑文件可分为流式文件和( )两类。

A.索引文件 B.链接文件 C.记录式文件 D.只读文件12.由一串信息组成,文件内信息不再划分可独立的单位,这是指( )。

A.流式文件 B.记录式文件 C.连续文件 D.串联文件13.记录式文件内可以独立存取的最小单位是由( )组成的。

A.字 B.字节 C.数据项 D.物理块14.在随机存储方式中,用户以( )为单位对文件进行存取和检索。

A.字符串 B.数据项 C.字节 D.逻辑记录15.数据库文件的逻辑结构形式是( )。

A.链接文件 B.流式文件 C.记录式文件 D.只读文件16.文件的逻辑记录的大小是( )。

操作系统原理复习题最终

操作系统原理复习题最终

操作系统原理复习题一填空题:1.操作系统为用户提供三种类型的使用接口,它们是命令接口和程序接口和图形接口。

2.I/O控制方式的发展经历了4个阶段:程序查询方式、I/O中断方式、直接存储器访问DMA方式和I/O通道方式。

3.操作系统的五大功能包括__处理机管理、_存储器管理_、__文件管理_、_设备管理__、_____用户接口__。

4.文件的逻辑结构分流式文件和记录式文件二种。

5.进程主要由___程序段_、__数据段_、_进程控制块(PCB)_三部分内容组成,其中___进程控制块(PCB)_是进程存在的唯一标志。

6.虚拟设备是指采用SPOOLING技术,将某个独享设备改进为供多个用户使用的的共享设备。

7.文件系统中,用于文件的描述和控制并与文件一一对应的是文件控制块。

8.段式管理中,以段为单位,每段分配一个连续区。

由于各段长度不同,所以这些存储区的大小不一,而且同一进程的各段之间不要求连续。

9.逻辑设备表(LUT)的主要功能是实现设备独立性。

10.文件的物理结构分为顺序文件、链接文件和索引文件。

11.所谓设备控制器,是一块能控制一台或多台外围设备与CPU并行工作的硬件。

12.操作系统三大基本类型:批处理操作系统、分时操作系统和实时操作系统。

13.按文件的逻辑存储结构分,文件分为有结构文件,又称为记录式文件和无结构文件,又称流式文件。

14、在设备管理中,为了克服独占设备速度较慢、降低设备资源利用率的缺点,引入了虚拟分配技术,即用共享设备模拟独占设备。

15、常用的内存管理方法有分区管理、页式管理、段式管理和段页式管理。

16、在存储管理中常用虚拟存储器方式来摆脱主存容量的限制。

17、置换算法是在内存中没有空闲页面时被调用的,它的目的是选出一个被淘汰的页面。

如果内存中有足够的空闲页面存放所调入的页,则不必使用置换算法。

18、文件的存储器是分成大小相等的物理块,并以它为单位交换信息。

19、缓冲区的设置可分为单缓冲、双缓冲、循环缓冲和缓冲池。

2335自考《网络操作系统》最完整的学习笔记详解

2335自考《网络操作系统》最完整的学习笔记详解

第一章网络操作系统引论1. ①操作系统的定义:操作系统是控制和管理计算机系统的硬件和软件资源、合理地组织工作流程以及方便用户的程序集合。

②现代操作系统的基本特征:1、并发性2、共享性3、虚拟性4、不确定性2.操作系统在计算机系统中处于何种地位:是硬件层的第一次扩充,是计算机系统软件的重要组成部分。

计算机系统的层次结构:硬件层—操作系统层—语言处理程序层—应用程序层。

操作系统的作用:提高计算机系统的效率,增强系统的处理能力,充分发挥系统资源的利用率,方便用户使用。

3.多道程序设计的硬件基础:①中断系统②通道技术③CPU与通道的通信4.①多道程序设计的基本原理:多道程序设计的主要目的是充分利用系统中所有资源且尽可能地让它们并行操作。

采用通道技术后使CPU从繁琐的I/O操作中解放出来,它不仅能实现CPU与通道并行工作,而且也能实现通道与通道之间、各通道与外设之间的并行。

②多道程序设计的主要特点:①多道②宏观上并行③微观上串行。

5.实现多道程序设计要解决的几个问题:①存储保护和地址重定位。

(几道程序共享同一主存)②处理机的管理和调度。

(共享同一处理机)③资源的管理与分配。

(共享系统资源)6. 虚拟处理机:逻辑上的处理机称为虚拟处理机。

虚拟计算机:在一台计算机上配置操作系统后,比原来的计算机的功能增强了。

这种是概念上的、逻辑上的计算机,而不是真正的物理计算机,这样的计算机称为虚拟计算机。

7.处理机的运行现场:就是指处理机在执行程序过程中任一时刻的状态信息的集合。

处理机运行现场包括的内容:①指令计数器(程序计数器)②程序状态寄存器③通用寄存器④特殊控制寄存器。

处理机的运行状态有两种:核心态(00)和用户态(11)。

程序分为系统程序和用户程序。

程序状态分为三种:①就绪②运行③阻塞。

程序状态的作用:程序状态可以互相转换,便于处理机按照某种规则进行调度。

8. 访管指令、特权指令、系统调用之间的区别和联系:9.①系统调用:用户在程序中能用访管指令调用的,由操作系统提供的子功能集合,其中每一个子功能称为一个系统调用命令。

操作系统期末练习(5-8章)

操作系统期末练习(5-8章)
A.程序I/O方式B.中断驱动I/O控制方式
C.直接存储器访问DMA控制方式D. I/O通道控制方式
6.利用通道实现了()之间数据的快速传输。
A. CPU和外设B.内存和CPUC.内存和外设D.外设和外设
7.下列哪种设备不是从设备分配策略角度来说的。()
A.系统设备B.独享设备C.共享设备D.虚拟设备
9.下列哪一个选项的描述不是树型目录的优点()。
A.解决了文件重名问题B.提高了文件的检索速度
C.根目录到任何文件有多条通路D.便于进行存储权限控制
10.下面是关于文件的一些操作。若需要读一个文件,那么描述次序正确的是()。
1)将文件的目录信息读入内存。
2)向设备管理程序发出I/O请求,完成数据读入操作。
试借助地址变换图(要求画出地址变换图)求出有效逻辑地址4865所对应的物理地址。
7.设一段表如下所示。
那么逻辑地址(2,88)对应的物理地址是()。逻辑地址(4,100)对应的物理地址是()。
8.某系统采取动态分区管理技术。某时刻在内存有三个空闲区,它们的首地址和大小分别是:空闲区1(100KB,10KB),空闲区2(200KB,30KB),空闲区3(300KB,15KB)。现有如下作业序列:作业1需求15KB,作业2需求16KB,作业3需求10KB。要求:
A.每个进程拥有一张页表,且进程的页表驻留在内存中
B.每个进程拥有一张页表,但只将执行进程的页表驻留在内存中,其他进程的页表不必驻留在内存中
C.所有进程共享一张页表,以节约有限的内存空间,但页表必须驻留在内存中
D.所有进程共享一张页表,只有页表中当前使用的页面必须驻留在内存中,以最大限度地节约有限的内存空间。
A.既可随即访问,又可顺序访问B.只能随即访问
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#define FDF -1#define FFF -2#define MAX1 30#define MAX2 32#define LIST_INIT_SIZE 100 //线性表存储空间的初始容量#define LISTINCREMENT 20 //线性存储空间的分配增量typedef struct{char name;int start;}fcb;fcb a[MAX1];typedef struct{int order; //索引表记录号int block; //物理块号}indextab;typedef struct{char filename; //文件名indextab *ind; //索引表指针int length; //当前长度int listsize; //当前分配的初始容量}filetab;typedef struct{filetab *file; //文件目录表指针char name[10]; //用户名int length; //当前长度int listsize; //当前分配的初始容量}usertab;usertab *newbase;typedef struct{usertab *user; //用户表指针int length;int listsize;}Sqlist;Sqlist s;int fat[MAX2]; //定义fat表项int filenum = 1; //记录文件的个数,文件数随着保存而增加int c = 0; //记录所有用户的数量int h ; //记录每个用户文件的个数int m ; //m存放的是文件的个数int count1 = 0; //记录文件的个数,随着转换索引表而动态改变char savename[10][1]; //保存用户名char cr; //记录插入文件的名字void begin();void display();void insert();void save();void change(char name[]);void after();void alter();void write(int n);void read(int n);void main(){char name[10];int x,i;while(1){for(i=0;i<10;i++)savename[i][1] ='\0';printf("*************************************************************** \n");printf("\n\t模拟设计MS-DOS操作系统中磁盘文件的索引文件结构\n");printf("\n\t\t选择1: 初始化fat");printf("\n\t\t选择2: 写入文件");printf("\n\t\t选择3: 读出文件");printf("\n\t\t选择4: 显示fat表");printf("\n\t\t选择5: 插入逻辑记录号操作");printf("\n\t\t选择6: 保存文件操作");printf("\n\t\t选择7: 转换索引表");printf("\n\t\t选择8: 显示转换后的索引表");printf("\n\t\t选择0: 结束");printf("\n\n***************************************************** **********\n");printf("请输入选择的操作:");scanf("%d",&x);switch(x){case 1:begin();break;case 2:write(filenum);break;case 3:read(filenum);break;case 4:display();break;case 5:insert();if(count1-1>=filenum)alter();break;case 6:save();break;case7:printf("\n*********************************************\n");while(count1-1<filenum) //在存入索引表的文件小于等于总文件个数的时候{printf("将fat表转换成索引表\n");while(1){printf("请输入用户名\n");fflush(stdin);scanf("%s",name);change(name);break;}}break;case 8:after();break;case 0:break;}if(x==0) break;}}void display(){int i = 0,n,q;printf("此时fat表纪录情况为:\n");for(i=0;i<MAX2;i++)printf("%d : %d\n",i,fat[i]);printf("\n此时文件目录表中的情况为:\n");printf("-------------------------------------------\n");printf("文件名\t\t起始块号\t文件长度\n");for(i=0;i<=filenum;i++){q=0;n=a[i].start;while(1){n = fat[n];q++; //记录此文件的逻辑记录长度if(n==FFF)break;}printf("%4c\t\t%4d\t\t%4d\n",a[i].name,a[i].start,q);}printf("-------------------------------------------\n");}void write(int n) //将信息写入文件保存{FILE *fp;int i;n=n+1;if((fp=fopen("file","wb"))==NULL){printf("无法打开该文件\n");exit(0);}if(fwrite(&n,sizeof(int),1,fp)!=1) //将文件个数写入磁盘printf("fill write error\n");for(i=0;i<n;i++){if(fwrite((&a[i]),sizeof( fcb),1,fp)!=1)printf("fill write error\n");}for(i=0;i<MAX2;i++)//将FAT表所有信息写入文件{if(fwrite((&fat[i]),sizeof(int),1,fp)!=1)printf("fill write error\n");}fclose(fp);}void read(int n) //从文件读入信息进行初始化{FILE *fp;int i;n=n+1;if((fp=fopen("file","rb"))==NULL)printf("can't open fill\n");if(fread(&n,sizeof(int),1,fp)!=1) //将文件个数读出printf("fill write error\n");for(i=0;i<n;i++)fread((&a[i]),sizeof( fcb),1,fp);for(i=0;i<MAX2;i++)//读入FAT的信息fread((&fat[i]),sizeof(int),1,fp);fclose(fp);}void begin(){int i,j = 0;printf("初始化fat表\n");fat[0] = FDF;fat[1] = FFF;for(i=2;i<MAX2;i++)fat[i] = 0;a[0].name = 'A';a[0].start = 2;fat[a[0].start] = 4; //初始化第一个文件fat[4] = 5;fat[5] = 12;fat[12] = 19;fat[19] = 24;fat[24] = FFF;a[1].name = 'B'; //初始化第二个文件a[1].start = 6;fat[a[1].start] = 8;fat[8] = 14;fat[14] = 18;fat[18] = 22;fat[22] = 26;fat[26] = 30;fat[30] = FFF;display();er = (usertab *)malloc(LIST_INIT_SIZE*sizeof(usertab)); //为用户分配空间if(!er)exit(-2);s.length = 0;s.listsize = LIST_INIT_SIZE;}void insert(){int k,j,start1,s,n,q,w;int i=0,p=0;char iname,jname;printf("请输入你要插入的文件名\n");fflush(stdin);scanf("%c",&iname);for(i=0;i<MAX1;i++) //在文件目录表中找到此文件{if(a[i].name!=iname){q = i; //记录是第几个文件continue;}else{jname = a[i].name;cr = iname; //记录插入文件的名字printf("存在此文件!\n");n = a[i].start;while(1){n = fat[n];p++; //记录此文件的逻辑记录长度if(n==FFF)break;}printf("此文件的记录长度为:%d\n",p);while(1){printf("请在此1--%d范围内输入你要插入的记录号\n",p);scanf("%d",&k);fflush(stdin);if(k<=0||k>p){printf("记录号错误重新输入\n");continue;}else break;}for(i=0;i<MAX2;i++) //查找第一个空闲块号{if(fat[i]!=0){w = i;continue;}else{printf("有空闲块%d\n",i);j = i; //j为空闲块号printf("逻辑纪录号对应的物理块号为:");for(i=0;i<MAX1;i++) //查找此文件第一个物理块号{if(iname==a[i].name){start1=a[i].start;break;}}for(i=0;i<k-1;i++) //查找逻辑块号对应的物理块号{m = fat[start1];start1 = m;}printf("%d\n",start1);s = fat[start1]; //插入纪录fat[start1] = j;fat[j] = s;break;}if(w==MAX2-1&&fat[w]!=0){printf("无空闲块结束\n");break;}}}break;}if(q==MAX1-1&&jname!=iname)printf("不存在此文件,结束\n");}void save(){char name1;int num1,i,count=0;int b[MAX2]; //数组b中存放空闲区物理块号printf("请输入要保存文件的信息:文件名和长度\n"); fflush(stdin);scanf("%c %d",&name1,&num1);fflush(stdin);filenum++;m=filenum; //m存放的是文件的个数for(i=0;i<MAX1;i++){if(name1==a[i].name){printf("有同名文件!\n");return;}}printf("无同名文件,可以保存!\n");for(i=0;i<MAX2;i++){if(fat[i]==0){b[count] = i;count++;}}if(count<num1){printf("磁盘空间不够!\n");return;}a[filenum].name = name1;a[filenum].start = b[0];printf("已将文件存入物理块中\n");for(i=0;i<num1-1;i++)fat[b[i]] = b[i+1];fat[b[i]] = FFF;}void change(char name[]){int j=0; //记录当前用户文件的个数int k,n,i;int flag;char fname;if(s.length>=s.listsize){newbase = (usertab*)realloc(er,(s.listsize+LISTINCREMENT)*sizeof(usertab));if(!newbase)exit(-2);er = newbase;s.length+=LISTINCREMENT;}for(i=0;i<10;i++) //将用户名记录到用户表中er[c].name[i] = name[i];printf("用户的名字:%s\n",er[c].name);er[c].file = (filetab *)malloc(LIST_INIT_SIZE*sizeof(filetab)); //为文件目录表分配空间if(!er[c].file)exit(-2);er[c].length = 0;s.length++; //用户个数加一er[c].listsize = LIST_INIT_SIZE;while(1){if(er[c].length>=er[c].listsize) //分配空间{newbase->file = (filetab*)realloc(er[c].file,(er[c].listsize+LISTINCREMENT)*sizeof(filetab));if(!newbase->file)exit(-2);er[c].file = newbase->file;er[c].length+=LISTINCREMENT;}repeat:fflush(stdin);printf("请输入此用户的文件名\n");fflush(stdin);scanf("%c",&fname);fflush(stdin);for(i=0;i<=m;i++) //查找此文件是否被其他用户占有{if(fname==savename[i][1]){printf("此文件已经被别的用户占用请重新输入\n");goto repeat;}}for(i=0;i<MAX1;i++){if(fname==a[i].name){h=i; //h记录用户的文件break;}else if(i==MAX1-1){printf("不存在此文件重新输入\n");goto repeat;}}savename[h][1] = fname;count1++; //索引表中文件加一er[c].file[j].filename = fname;er[c].file[j].ind = (indextab*)malloc(LIST_INIT_SIZE*sizeof(indextab)); //为文件索引表分配空间if (!er[c].file[j].ind)exit(-2);er[c].file[j].length=0;er[c].length++; //用户文件长度加一er[c].file[j].listsize = LIST_INIT_SIZE;n = a[h].start;for(k=0;;k++){if(er[c].file[j].length>=er[c].file[j].listsize){newbase->file[j].ind = (indextab*)realloc(er[c].file[j].ind,(er[c].file[j].listsize+LISTINCREMENT)*sizeof(indext ab));if(!newbase->file[j].ind)exit(-2);er[c].file[j].ind = newbase->file[j].ind;er[c].file[j].length+=LISTINCREMENT;}er[c].file[j].ind[k].order = k+1;er[c].file[j].ind[k].block = n;n = fat[n];er[c].file[j].length++;if(n==-2)break;}j++;c++;if(count1-1==filenum){printf("fat表转换完毕!\n");return;}while(1){printf("此用户是否还有另外的文件?如果有文件输入1,否则输入0\n");fflush(stdin);scanf("%d",&flag);fflush(stdin);if(flag==1){c--;break;}else if(flag!=0){printf("输入错误,重新输入\n");continue;}elsebreak;}if(flag==0)break;}}void after(){int i,j,k;printf("**********************************\n");fflush(stdin);for(k=0;k<c;k++){fflush(stdin);printf("用户%s的索引表为:\n",er[k].name);fflush(stdin);for(i=0;i<er[k].length;i++){printf("文件名:%c\n",er[k].file[i].filename);printf("记录号:\t物理块号:\n");for(j=0;j<er[k].file[i].length;j++)printf("%4d\t%4d\n",er[k].file[i].ind[j].order,er[k].file[i].ind[j].block);}}}void alter(){int i,j,k=0,d,z;for(i=0;i<MAX1;i++) //找到插入记录文件的首块号{if(cr==a[i].name)d = a[i].start;}for(j=0;j<s.length;j++)for(z=0;z<er[j].length;z++)if(er[j].file[z].filename==cr){while(d!=-1) //将插入的记录插到索引表中{er[j].file[z].ind[k].order = k+1;er[j].file[z].ind[k].block = d;d = fat[d];k++;}er[j].file[z].length++; //此文件索引表长度加一}}。

相关文档
最新文档