文件I/O指针

1.1、辅存的物理排列
辅存一般是两面都能存储信息的硬盘的堆叠,这些光盘成为盘片,每个面成为盘面。盘片叠放在一个由电动机驱动旋转的主轴。
盘片的每个表面进一步划分成同心圆环成为磁道。柱面的值就是盘片每一面的磁道数。反过来,这些轨道进一步划分成扇区。扇区是实际存储数据体系结构的最小单元。
利用磁头从这些介质的表面实现数据读取。借助连接机械臂的移动磁头读取不同扇区。
每个扇区通常能存储512个字节。
对于操作系统,I/O数据传输的基本单元是块,也就是一组扇区。每组包含2、4、8,或更多的扇区。

1.2、硬盘驱动器与CPU的接口
硬盘控制器是负责CPU和硬盘之间的数据和命令通信的实体。硬盘控制器完成如下任务:
从CPU接收命令(读、写等);
执行驱动接口逻辑来控制机械臂运动;
使用读 / 写逻辑来序列化数据。

1.3硬盘寻址方案
硬盘寻址方案是一种根据磁道位置确定硬盘扇区的方法。根据扇区地址有两种寻址方案:

CHS寻址:寻址参数为C、H、S(分别代表轨道内柱面、磁头和扇区总数)
C:柱面数范围为0 ~ C-1;
H:0 ~ H-1;
S:1 ~ S。

LBA寻址:参数只有一个,参数为扇区编号0,1,2,3等,该方法用SCSI(Small Computer System Interface:小型计算机系统接口)和IDE(Integrated Device Electronics:电子集成驱动器)硬盘驱动器定位。

2、文件系统结构简介

2.1 逻辑文件系统
逻辑文件系统提供了查看文件的方法或抽象。它通常有两个主要逻辑实体(文件与目录),以及分层结构。
逻辑文件系统管理inode 结构体。inode 是硬盘结构体,用来管理所有的硬盘文件。inode 包含管理文件的下面所有信息:
类型(目录/文件);
保护级别;
文件的块信息;
文件的创建、修改的时间戳等;
文件的目录组织结构(每个文件系统);
卷控制块(每卷)包含超级块(UFS)和主文件表(NTFS);
引导控制块(每卷),成为引导块(UFS);
I/O控制:进行实际数据传输的程序是I/O控制的一部分。

2.2 基本文件系统
基本文件系统与设备驱动程序和通用低级命令接口进行交互。改成还涉及硬盘块管理。

3、创建一个文件系统
最重要的是要求保存数据大小及其存储位置的数据结构体。数据结构体在常见和维护文件系统时扮演非常重要的角色。在文件系统上下文中数据结构体分为两种方式。

硬盘数据结构体
数据结构体inode,该数据结构体包含存储在文件系统中全部的数据信息需要永久保存它。inode存储在一个被称为inode表的块内。块是扇区和柱面的逻辑表示。
硬盘中存储其他数据结构体如下所示:
引导控制块:这里保存的信息用来从分区启动操作系统;
分区控制块:也称超级块。包含未占用块与被影射块所在分区的细节等信息。

内存数据结构体
对于内存的每个进程,操作系统有预知相关联的文件表数据结构体。这有助于跟踪进程打开的文件数目。以下为与文件系统交互时加载到内存的数据结构体:
每个进程相关联的文件表;
目录结构;
分区表。

4、访问文件
C语言提供了大量函数来操作辅存盘的文件。当某个文件交互时就会调用缓冲区,操作系统使用该缓冲去来提高I/O效率。C语言提供一个FILE数据结构体对象与实际文件交互以操作它及其在内存中的数据。
对于大多数调用函数如open、close、delete等都会用到FILE类型指针。FILE数据结构体定义在C语言中名为stdio.h的头文件中。
FILE 数据结构体
如上所述,FILE数据结构体定义在stdio.h头文件中。它包含文件流的信息,还包含文件位置和缓冲区等信息。在stdio.h文件中,定义文件流的特殊类型用来表示一些特殊设备。
STDIN:该值用来表示一个输入流;
STDOUT:该值用来表示一个输出流;
STDERROR:该流用来表示标准错误。
在这里我们用与文件关联的EOF值表示数据结束。该值为负的整型常量。

5、首要任务
要操作文件或其中的数据,我们必须打开文件。不打开文件我们不能做任何事情。首先,调用打开文件函数。
FILE *fopen(char *filename , char *mode);
该函数接受文件路径名作为第一个输入参数,第二个参数为文件打开的模式(如r,w或a)。
读模式(r):以读模式打开文件。如果文件不存在,函数调用返回null。
写模式(w):以写模式打开文件,如果文件不存在,调用函数创建一个新文件。如果该文件存在,那么文件的就内容将被覆盖。
追加模式(a):以追加模式打开文件夹。如果文件存在,则新内容写入到文件末尾之后。如果文件不存在,则创建一个新文件。
当成功打开文件是函数返回FILE 结构体类型指针。下面的代码演示了fopen()函数的用法。
FileProgramma.c

#include <stdio.h>
int main(int argc,char *argv[])
{
FILE *fp=NULL;
fp = fopen("c:\\test.txt","w");
if(fp == NULL)
{
printf("File opening error\n");
}
else
{
printf("File opening success\n");
}
return 0;
}

6、次要任务
对于进程来说文件是资源。如果进程打开了文件,在操作/处理结束后需要释放。我们使用另一个与fopen()函数对等的函数施工方自愿。调用fclose()函数来关闭打开的文件。
int fclose(FILE *fptr);
该函数接受一个文件指针作为输入参数,如果成功返回0,失败返回EOF。下面的会员代码说明fclose()函数调用的用法。
FileProg2.c

#incldue <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp=NULL;
int res;
fp=fopen("C:\\test.txt","w");
if(fp == NULL)
{
printf("File opening error\n");
}
else
{
printf("File opening success\n");
}
res = fclose(fp);
if(res == 0)
{
printf("File closed\n");
}
else
{
printf("Unable to close file\n");
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值