操作系统中文件句柄和文件FILE指针

当你读或写一个文件时,必须先通知系统,告诉他你的举动,这便是一个打开文件的过程。在这里说写一个文件(w方式),如果文件不存在,便创建一个文件,失败那就不用说拉,如果成功拉呢?系统将怎样管理你的文件(你的文件有可能不只有一个)。
这时,文件将返回一个整数值,该值唯一标识这个文件,每个被创建的文件都会有一个唯一标识值,称为文件标识符。(注:r方式不必考虑,他必须通过创建过程)
       在c语言中,大家都知道。一旦你成功打开一个文件,他将返回一个文件指针。我们是这样做的:
              FILE *fp;
              fp=fopen(“文件”,文件状态(如w,r,r+));
       当上面的操作成功后fp就会赋予你打开文件的最基本信息!大家先看FILE结构
       在stdio.h中声明
typedef struct{
    short         level;           //缓冲区满与空的程度
    unsigned      flags;    //文件状态标志
    char          fd;               //文件描述符
    unsigned char hold;     //无缓冲区,不读字符
    short         bsize;          //buffer大小
    unsigned char *curp;   //当前指向
    unsigned      istemp;    //临时文件知指示
    short         token;        //有效性检测
}    FILE;
       为了管理你打开的文件,操作系统为所有的文件创建一个打开文件信息的结构体数组------文件控制块(fcb),而文件描述符就承担了访问与之对应的文件文件控制块的使命,它在c中就充当文件句柄。每一个文件都需要唯一的一个标识,这样才能管理若干个文件。
      注:fcb存储了你打开的所有文件的信息,而只有通过文件句柄才能访问与之对应的fcb,从而访问你的文件。(文件句柄,就是fcb结构数组的下标)。

       所以我们要做的第一件事就是声明一个FILE结构的指针,然后调用库函数fopen()创建一个FIEL结构的文件句柄,唯一标识这个文件。
      FILE *fp0,*fp1,*fp2;
      fp0=fopen("test0.txt","w");
      fp1=fopen("test1.txt","w");
      fp2=fopen("test2.txt","w");
      printf("%d",fp0->fd);//输出文件句柄值。
      printf("%d",fp1->fd);
      printf("%d",fp2->fd);
你可以输出FILE中的值,可以看到很多内幕。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件管理 一、实验目的: 1.了解os文件的组织和管理。 2.熟悉文件所用的数据结构。 二、实验要求: 1. 设计一个N个用户的文件系统,每个用户最多保存m个文件。 2. 限制用户在一次使用只能打开L个文件。 3. 系统应能检查输入命令的正确性,出错能显示出原因。 4. 对文件必须设置保护措施,如只读、写、执行等。在每次打开时再次设置保护级别,即 可有二级保护。 5. 对文件的操作至少有以下几条命令 create:建文件 delete:删文件 open:打开文件 close:关闭文件 read:读文件 write:写文件 举例:主文件目录 mfd=record username :string[maxlen]; files :array[1..L] of ufd; ofiles :arrau[1..S] of uod end; 用户打开文件目录表: uod=record filename:string[maxlen]; attrib:attrib; len:integer; status:(open,create); rp,up:integer; end; 用户文件目录: ufd=record fielname:string[maxlen]; attribΛro,rw); len:integer; addr:integer; end; 流程图: 开始 输入用户名 在MFD找到该用户名 显示该用户名UFD所有文件 初始化AFD 操作 命令 CREATE DELTET OPEN CLOSE READ WRITE 保护当前文件目录 结束 二、主要数据结构 界面采用VC6 MFC环境开发 #define MAXFILE 20 //每个用户最多保存20个文件 #define MAXUSER 10 //假想文件系统最多支持的人数 #define BLOCKSIZE 32 //虚拟磁盘物理块为每块32字节 #define DISKSIZE BLOCKSIZE*1000 //虚拟磁盘容量为1000*32=32K struct UFD //说明文件项的结构数组 { char FileName[15]; char Time[16]; //文件建立或修改时间 如2003/5/6 12:00 bool IsExist; //文件是否存在,删除时标为0 bool IsShared; //共享标记,共享文件可被其它用户所访问 bool AttrRead; //文件是否可读 bool AttrWrite; //文件是否可写 bool AttrExecute; //文件是否可执行 HTREEITEM treeNode; //用于树控件显示的结点句柄 USHORT FileLen; //文件占用字节数 USHORT BlockNum; //文件占用的物理块数 USHORT FileLink[100];//文件物理块地址数组,每块32字节,限定一个文件最大100*32=3200字 节 }; struct MFD { char UserName[10]; //主目录用户名 bool IsExist; //该用户否存在 UFD ufd[MAXFILE]; //用户文件数组 USHORT nItem;//UFD个数 }; struct HEADBLOCK { BYTE pStack; //堆栈指针 SHORT pBlock[10]; //块号 pBlock[10]是下一个盘块号逻辑地址 }; struct BLOCK //虚拟磁盘的物理块数据结构 { union{ BYTE block[32];        //一块为32字节 HEADBLOCK HeadInfo; }; }; struct FAT { BLOCK SuperBlock; //超级块,指示第一个空闲块逻辑号 USHORT MaxOpen; //该用户同时可打开的最大文件数 USHORT UserNum; //最户数 MFD Mfd[MAXUSER]; //最多可支持10个用户 }; //空闲块成组链接法 bool OpenList[MAXUSER][MAXFILE]; //描述文件是否打开的布尔型数组 FAT FileFAT;           //描述文件记录项的FAT结构 CFile FATIO; //负责和VDISK.DAT打交道的文件句柄 CString CurrentUser; //当前登录的用户名 Int CurrentID; //前前登录的用户标识号 说明:本实验采用模拟文件结构的方法,把记录用户帐号,用户文件和磁盘块的信息 用当前目录下的VDISK.DAT来记录,可以把VDISK.DAT看成是一个虚拟的磁盘,其头部是 FAT结构,用来记录各个用户和文件信息,紧接着是空闲

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值