7.逻辑结构VS物理结构

news2024/11/24 0:29:24

第四章 文件管理

7.逻辑结构VS物理结构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​   fopen这个函数做的事情就是打开了“test.txt”这个文件,并且“w”说明是以“写”的方式打开的,以“写”的方式打开才能往这个文件里写入数据,如果文件打开了那么fp这个指针就可以指向和这个文件相关联的一些信息,FILE这个数据结构是C语言内部已经定义好的,可以把fp这个指针理解为指向我们要操作的文件。fputs这个C语言提供的库函数可以往fp所指向的文件中写入数据,在操作完文件后需要调用fclose这个库函数来关闭文件。

在这里插入图片描述

  如果在这个文件中要找到第16个字符,首先还是用fopen打开文件,然后调用C语言提供的库函数fseek,这个库函数做的事情就是会把文件的读写指针指向16这个位置,也就是文件的第16个字节,接下来再调用fgetc这个库函数来读出当前这个读写指针所指向位置一个字节的内容。总之可以利用fseek这个函数可以把文件的读写指针指向任何一个想要读写的位置,再利用其他函数读出若干个字节的数据。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

​   用C语言创建顺序文件:struct这个结构体表示一个学生的信息。C语言提供的库函数fwrite可以把刚才定义的n个学生的信息,即n个struct结构体存入fp所指向的文件中,第一个参数student指明了要写入的数据的起始地址,这里其实就是student[N]这个数组的首地址(C语言中学过数组名里存放的是数组的起始地址),第二个参数指明了每一条记录占多大的空间,第三个参数指明了要写入几条记录。
​   现在要从文件中读出编号为5的学生的信息,调用fseek这个函数,fseek这个函数的作用会让文件的读写指针指向从开头位置开始,向后偏移5*sizeof(Student_info)这个位置。然后调用fread这个函数,第三个参数1表示读出一条记录,第二个参数表示这个记录的大小,把读出的数据赋给stu这个变量,如此便可以读出编号为5的学生的信息。

​   以下内容没搞懂:
​   刚才学生信息的例子中顺序文件采用的是顺序存储的方式,也就是这些记录逻辑上相邻的记录是一个连一个相邻的存放。其实在存储这些记录的时候当然也可以使用链式存储的方式实现,比如说当定义学生信息的时候可以再增加一个next字段,这个字段是指向了下一个学生记录的存放位置。同样可以定义一个数组来存放这些信息。0号学生的信息是存在数组下标为0的位置,可以在这个学生对应的结构体中记录下一个学生即1号学生的存放位置,1号学生存在数组下标为3的位置,所以0号学生对应的结构体中next变量的值可以设置为3,这样就相当于建立了一个指向下一个记录的指针,这就是链式存储。所有学生的数据是存放在这样的一大片的连续空间中,但是各个逻辑上相邻的学生数据又是通过链接指针的方式连在一起的,这就是所谓顺序文件的链式存储,这其实是由用户自己决定的。如果采用顺序存储的方式来存放各个学生记录,那么可以很方便的算出第i个学生记录存放的逻辑地址,然后用这个逻辑地址就可以直接命中想要找的那条记录;如果采用链式存储方式,想要找的第i个学生信息只能先读入第1个学生的信息然后一个一个往后找,其实这里和数据结构中的顺序表和链表都是一样的。总之当我们在创建一个文件的时候,我们可以自己来决定到底是用顺序存储的方式来存放这些记录,还有用链式存储的方式来存放这些记录,但无论如何在我们看来这些记录它们肯定是占用了一整片的连续空间【*】,这是从我们的视角看到的。从操作系统的视角来看,刚才我们实现的链式存储的顺序文件,其实操作系统在背后也会把它拆分为一个一个的块,然后这些物理块操作系统在背后有可能采用连续分配的方式把它们存放在磁盘中,当然也可以采用链接分配的方式把它们存放在磁盘中。这就是比较令人疑惑的点,在将逻辑结构的时候讲到顺序文件可以采用链式存储的方式,在讲物理结构的时候又讲到链接分配的方式,这两个东西看起来很像,其实文件的逻辑结构里面聊到所谓的链式存储指的是在文件的内部,这些记录的先后顺序是用链接指针把它们连起来的,这是由我们文件主自己来设计的,在文件的物理结构里面提到的所谓的链接分配,其实这个链接是操作系统做的事情,操作系统会把我们给出的一整个很大的文件拆分成一个一个的逻辑块,然后在磁盘里面存放这些逻辑块的时候操作系统会用链接的方式来记录这些逻辑块它们之间的先后顺序。可以用这个例子好好体会一下逻辑结构里的链式存储和物理结构里的链接分配它们的区别,总之在讲文件逻辑结构的时候我们谈到的链式存储,其实这些链接信息是我们用户是需要关心的,操作系统它并不关心;而文件的物理结构里面提到的链接分配,这些链接信息是操作系统需要关心的,我们用户并不需要关心。

​   对【*】处的那句话“在我们看来这些记录它们肯定是占用了一整片的连续空间”的理解。课本上对于顺序文件的定义:“顺序文件:文件中的记录一个接一个地顺序排列,记录通常是定长的,可以顺序存储或以链表的形式存储,在访问时需要顺序搜索文件。”从定义可以看出文件的记录在逻辑地址空间上是连续的,占用一整片连续的逻辑地址空间,在顺序存储时各个记录在逻辑上相邻,那么在逻辑地址空间上也相邻;在链式存储时,在各个记录在逻辑上相邻,但在逻辑地址空间上可以不相邻;[这里结合ppt上顺序存储和链式存储的图好理解]。但无论如何,所有的记录占用的是一整片连续的逻辑地址空间。

​   (基于上面的例子,自己对文件的逻辑结构和物理结构的简单理解简单说一下:文件的逻辑结构:顺序文件、索引文件、索引顺序文件都是指文件在逻辑上是怎样的关系,顺序文件中的顺序存储在定长记录下支持随机访问指的是可以直接得到第i条记录的逻辑地址,将第i条记录的逻辑地址传给操作系统,操作系统将其分为逻辑块号、块内地址,然后操作系统负责实现逻辑块号到物理块号的转变,得到最终的物理地址,取出数据;顺序文件的链式存储不支持随机访问指的是不能直接得到第i条记录的逻辑地址,只能依次读入0到i-1条记录,第i-1条记录中保存了指向第i条记录的指针,然后得到第i条记录的逻辑地址,同上,操作系统负责实现逻辑地址到物理地址的转变,得到最终的物理地址,取出数据。文件的物理结构:连续分配,链接分配、索引分配(索引链接、多层索引、混合索引)指的是文件的数据是如何存放在磁盘上的,文件的磁盘块之间如何联系起来。物理结构上支持随机访问指的是可以直接命中要访问的磁盘块。在链接分配的隐式链接(除最后一个磁盘块外,各磁盘块中保存了指向下一个磁盘块的链接指针)中,FCB中保存了起始块号,要访问逻辑块号为i的磁盘块,必须先访问0号逻辑块(FCB中保存了0号逻辑块的磁盘块号即起始块号),得到1号逻辑块的磁盘块号,访问1号逻辑块得到2号逻辑块的磁盘块号…以此类推,读入i-1号逻辑块得到i号逻辑块的磁盘块号,再访问i号逻辑块,从中可以知道隐式链接不支持随机访问。而在显式链接中,要访问i号逻辑块通过查询FAT表可以找到i号逻辑块对应的磁盘块号,因此可以直接访问i号逻辑块,而不必依次读入0到i-1号逻辑块,所以显式链接是支持随机访问的。)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Eclipse如何设置快捷键

在eclopse设置注释行和取消注释行 // 打开eclipse,依次打开:Window -> Preferences -> General -> Key,

数据结构--关键路径

数据结构–关键路径 AOE⽹ 在 带权有向图 \color{red}带权有向图 带权有向图中,以 顶点表示事件 \color{red}顶点表示事件 顶点表示事件,以 有向边表示活动 \color{red}有向边表示活动 有向边表示活动,以 边上的权值表示完成该活动的开销 \…

HCIE--------------------------------------第一节OSPF快速收敛(OSPF与BGP联动)

一、OSPF快速收敛概述 OSPF快速收敛是为了提高路由的收敛速度而做的扩展特性,包括:PRC(Partial Route Calculation,部分路由计算)和智能定时器。 同时,OSPF支持故障恢复快速收敛,例如通过OSPF …

Linux Server 20.04 Qt5.14.2配置Jetson Orin Nano Developer Kit 交叉编译环境

最近公司给了我一块Jetson Orin Nano的板子,让我搭建交叉编译环境,所以有了下面的文章 一 :Qt5.14.2交叉编译环境安装 1.准备 1.1设备环境 1.1.1 Server: Ubuntu20.04: Qt 源码 5.14.2 Qt 软件 5.14.2 gcc 版本 9.4.0 g 版本 9.4.0 1.1.2 Jetson …

在 React 中获取数据的6种方法

一、前言 数据获取是任何 react 应用程序的核心方面。对于 React 开发人员来说,了解不同的数据获取方法以及哪些用例最适合他们很重要。 但首先,让我们了解 JavaScript Promises。 简而言之,promise 是一个 JavaScript 对象,它将…

openGauss学习笔记-42 openGauss 高级数据管理-触发器

文章目录 openGauss学习笔记-42 openGauss 高级数据管理-触发器42.1 语法格式42.2 参数说明42.3 示例 openGauss学习笔记-42 openGauss 高级数据管理-触发器 触发器会在指定的数据库事件发生时自动执行函数。 42.1 语法格式 创建触发器 CREATE TRIGGER trigger_name { BEFORE…

Java8实战-总结16

Java8实战-总结16 引入流流与集合只能遍历一次外部迭代与内部迭代 引入流 流与集合 只能遍历一次 和迭代器类似,流只能遍历一次。遍历完之后,这个流就已经被消费掉了。可以从原始数据源那里再获得一个新的流来重新遍历一遍,就像迭代器一样…

使用qsqlmysql操作mysql提示Driver not loaded

环境: win10 IDE: qt creator 编译器: mingw32 这里简单的记录下。我遇到的情况是在IDE使用debug和release程序都是运行正常,但是当我编译成发布版本之后。老是提示Driver not load。 这就很奇诡了。 回顾了下编译的时候是需要在使用qt先编译下libqsqlmysql.dll的…

从入门到精通Python隧道代理的使用与优化

哈喽,Python爬虫小伙伴们!今天我们来聊聊如何从入门到精通地使用和优化Python隧道代理,让我们的爬虫程序更加稳定、高效!今天我们将对使用和优化进行一个简单的梳理,并且会提供相应的代码示例。 1. 什么是隧道代理&…

V2board缓存投毒漏洞复现

1.什么是缓存投毒 缓存投毒(Cache poisoning),通常也称为域名系统投毒(domain name system poisoning),或DNS缓存投毒(DNS cache poisoning)。它是利用虚假Internet地址替换掉域名系…

数据结构—排序

8.排序 8.1排序的概念 什么是排序? 排序:将一组杂乱无章的数据按一定规律顺序排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。 如果参加排序的数据结点包含多个数据域,那么排序往…

Arduino 入门学习笔记10 使用I2C的OLED屏幕

Arduino 入门学习笔记10 使用I2C的OLED屏幕 一、准备工具二、JMD0.96C-1介绍1. 显示屏参数2. SSD1306驱动芯片介绍: 三、使用Arduino开发步骤1. 安装库(1)Adafruit_GFX_Library 库(2)Adafruit_SSD1306 驱动库&#xff…

HCIP——STP配置案例

STP配置案例 一、简介二、实现说明1、华为实现说明2、其他厂商实现 三、STP原理1、协商原则2、角色和状态3、报文格式4、BPDU报文处理流程4.1 BPDU报文的分类4.2 BPDU报文的处理流程4.3 BPDU报文格式 四、使用注意事项五、配置举例1、组网需求2、配置思路3、操作步骤4、配置文件…

多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经…

大模型技术实践(一)|ChatGLM2-6B基于UCloud UK8S的创新应用

近半年来,通过对多款主流大语言模型进行了调研,我们针对其训练方法和模型特点进行逐一分析,方便大家更加深入了解和使用大模型。本文将重点分享ChatGLM2-6B基于UCloud云平台的UK8S实践应用。 01各模型结构及特点 自从2017年6月谷歌推出Transf…

【OpenCV学习笔记】我的OpenCV学习之路

刚开始接触OpenCV是因为需要进行图像的处理,由于之前没有接触过,所以只能自己进行学习,下面将学习的过程做简单记录分享。 OpenCV专栏链接 OpenCV学习笔记 一、引言 OpenCV(Open Source Computer Vision Library)是…

【C# 基础精讲】文件读取和写入

文件读取和写入是计算机程序中常见的操作,用于从文件中读取数据或将数据写入文件。在C#中,使用System.IO命名空间中的类来进行文件读写操作。本文将详细介绍如何在C#中进行文件读取和写入,包括读取文本文件、写入文本文件、读取二进制文件和写…

MyBatis动态SQL:打造灵活可变的数据库操作

目录 if标签trim标签where标签set标签foreach标签 动态SQL就是根据不同的条件或需求动态地生成查询语句,比如动态搜索条件、动态表或列名、动态排序等。 if标签 在我们填写一些信息时,有些信息是必填字段,有的则是非必填的,这些…

Docker版TDengine2.6升级到Tdengine3.0

此升级性质为导入导出操作 2.6版本操作步棸 进入docker容器 docker exec -it a5f88c26119d bash 查找taosdump文件路径 find -name /taosdump 进入taosdump外层文件夹中,执行导出命令 ./taosdump -o /root -D power -T 4 实际导出命令可根据个人需求查到官方文档…

Spring Boot中使用validator如何实现接口入参自动检验

文章目录 一、背景二、使用三、举例 一、背景 在项目开发过程中,经常会对一些字段进行校验,比如字段的非空校验、字段的长度校验等,如果在每个需要的地方写一堆if else 会让你的代码变的冗余笨重且相对不好维护,如何更加规范和优…