关于随机访问文件处理的c编程教程

基本文件操作包括:...

用c语言编程随机存取文件i/o

binary file

基本文件操作包括:

  • fopen-打开文件-指定文件的打开方式(读/写)和类型(二进制/文本)
  • fclose-关闭打开的文件
  • fread-从文件读取
  • fwrite-写入文件
  • fseek/fsetpos-将文件指针移动到文件中的某个位置
  • ftell/fgetpos-告诉您文件指针的位置

两种基本的文件类型是文本和二进制文件。在这两个文件中,二进制文件通常更容易处理。由于这个原因,而且对文本文件的随机访问不是经常需要做的事情,本教程仅限于二进制文件。上面列出的前四个操作同时适用于文本和随机访问文件。最后两个仅用于随机访问。

随机访问意味着您可以移动到文件的任何部分并从中读取或写入数据,而无需读取整个文件。多年前,数据存储在计算机磁带的大卷轴上。要想在磁带上找到一点,唯一的办法就是通读磁带。然后磁盘出现了,现在你可以直接读取文件的任何部分。

People communicating encrypted data using cloud computing

用二进制文件编程

二进制文件是任何长度的文件,其中包含值在0到255之间的字节。这些字节没有其他意义,这与文本文件不同,文本文件中的值13表示回车,10表示换行,26表示文件结束。读取文本文件的软件必须处理这些其他含义。

二进制文件是字节流,现代语言倾向于使用流而不是文件。重要的部分是数据流,而不是它的来源。在C语言中,您可以将数据视为文件或流。通过随机访问,您可以读取或写入文件或流的任何部分。使用顺序访问,您必须像大型磁带一样从一开始就循环访问文件或流。

此代码示例显示一个简单的二进制文件正在打开以进行写入,其中写入了一个文本字符串(char*)。通常,您可以通过文本文件看到这一点,但您可以将文本写入二进制文件。

本例打开一个二进制文件进行写入,然后向其中写入一个char*(字符串)。FILE*变量是从fopen()调用返回的。如果此操作失败(文件可能存在且处于打开状态或只读状态,或者文件名可能存在错误),则返回0。

fopen()命令尝试打开指定的文件。在本例中,test.txt与应用程序位于同一文件夹中。如果文件包含路径,则所有反斜杠必须加倍。“c:\folder\test.txt”不正确;您必须使用“c:\\folder\\test.txt”。

由于文件模式为“wb”,因此此代码正在写入二进制文件。如果文件不存在,则创建该文件;如果文件存在,则删除其中的任何内容。如果对fopen的调用失败,可能是因为文件已打开或名称包含无效字符或无效路径,fopen将返回值0。

尽管您可以只检查ft是否为非零(成功),但此示例有一个FileSuccess()函数来显式执行此操作。在Windows上,它输出调用的成功/失败和文件名。如果您在追求性能,那么这会有点繁重,所以您可能会将其限制在调试上。在Windows上,将文本输出到系统调试器的开销很小。

fwrite()调用输出指定的文本。第二个和第三个参数是字符的大小和字符串的长度。两者都定义为无符号整数大小。此调用的结果是写入指定大小的计数项。请注意,对于二进制文件,即使您正在编写字符串(char*),它也不会附加任何回车符或换行符。如果需要这些,则必须在字符串中显式包含它们。

用于读取和写入文件的文件模式

打开文件时,可以指定文件的打开方式:是新建文件还是覆盖文件,是文本文件还是二进制文件,是读文件还是写文件,以及是否要追加文件。这是使用一个或多个文件模式说明符完成的,这些说明符是单个字母“r”、“b”、“w”、“a”和“+”以及其他字母的组合。

  • r-打开文件进行读取。如果文件不存在或找不到,则此操作失败。
  • w-将文件作为空文件打开以进行写入。如果文件存在,其内容将被销毁。
  • a-在将新数据写入文件之前,在不移除EOF标记的情况下,在文件末尾打开文件进行写入(追加);如果文件不存在,则首先创建该文件。

将“+”添加到文件模式将创建三种新模式:

  • r+-打开文件进行读取和写入。(文件必须存在。)
  • w+-将文件作为空文件打开以进行读取和写入。如果文件存在,其内容将被销毁。
  • a+-打开文件进行读取和追加;追加操作包括在将新数据写入文件之前删除EOF标记,并在写入完成后恢复EOF标记。如果文件不存在,它将首先创建该文件。打开文件进行读取和追加;追加操作包括在将新数据写入文件之前删除EOF标记,并在写入完成后恢复EOF标记。如果文件不存在,它将首先创建该文件。

文件模式组合

此表显示了文本文件和二进制文件的文件模式组合。通常,您可以读取或写入文本文件,但不能同时读取或写入两者。对于二进制文件,您可以同时读取和写入同一个文件。下表显示了您可以对每个组合执行的操作。

  • r文本读取
  • rb+二进制读取
  • r+文本-读、写
  • r+b二进制-读、写
  • rb+二进制-读、写
  • w文本-写入、创建、截断
  • wb二进制-写入、创建、截断
  • w+文本-读、写、创建、截断
  • w+b二进制-读、写、创建、截断
  • wb+二进制-读、写、创建、截断
  • 一个文本-写,创建
  • ab二进制-写入、创建
  • a+文本-读、写、创建
  • a+b二进制-写入、创建
  • ab+二进制-写入、创建

除非您只是创建一个文件(使用“wb”)或只读取一个文件(使用“rb”),否则您可以使用“w+b”来解决问题。

一些实现还允许使用其他字母。例如,Microsoft允许:

  • 文本模式
  • c-提交
  • n-不提交
  • S-优化顺序访问的缓存
  • R-缓存非顺序(随机访问)
  • T-临时
  • D-delete/temporary,它在文件关闭时终止文件。

这些不是便携式的,所以使用它们会有风险。

随机存取文件存储示例

使用二进制文件的主要原因是它的灵活性,允许您在文件中的任何位置进行读取或写入。文本文件只允许您按顺序读取或写入。随着SQLite和MySQL等廉价或免费数据库的普及,减少了对二进制文件使用随机访问的需要。然而,随机访问文件记录有点过时,但仍然有用。

举例

假设该示例显示了在随机访问文件中存储字符串的索引和数据文件对。字符串长度不同,并按位置0、1等索引。

有两个void函数:CreateFiles()和ShowRecord(int recnum)。CreateFiles使用大小为1100的char*缓冲区来保存由格式字符串msg和n个星号组成的临时字符串,其中n从5到1004不等。在变量ftindex和ftdata中使用wb filemode创建两个文件*。创建后,这些用于操作文件。这两个文件是

  • 索引.dat
  • data.dat

索引文件包含1000条indextype类型的记录;这是结构索引类型,它有两个成员pos(类型为fpos_t)和size。循环的第一部分:

像这样填充字符串msg。

等等那么这个,

用字符串的长度和数据文件中写入字符串的点填充结构。

此时,索引文件结构和数据文件字符串都可以写入各自的文件。虽然这些是二进制文件,但它们是按顺序写入的。理论上,您可以将记录写入文件当前结尾之外的位置,但这不是一种好的使用技术,可能根本不可移植。

最后一部分是关闭这两个文件。这可确保文件的最后一部分写入磁盘。在文件写入期间,许多写入操作不会直接进入磁盘,而是保存在固定大小的缓冲区中。写入操作填满缓冲区后,缓冲区的全部内容将写入磁盘。

文件刷新功能强制刷新,您也可以指定文件刷新策略,但这些策略适用于文本文件。

显示记录功能

要测试是否可以检索数据文件中的任何指定记录,您需要知道两件事:它在数据文件中的起始位置以及它的大小。

这就是索引文件的作用。ShowRecord函数打开这两个文件,查找适当的点(recnum*sizeof(indextype)并获取字节数=sizeof(index)。

SEEK_SET是一个常量,指定从何处执行fseek。为此定义了另外两个常量。

  • SEEK_CUR-相对于当前位置进行搜索
  • SEEK_END-从文件末尾查找绝对值
  • SEEK_SET-从文件开始搜索绝对值

您可以使用SEEK_CUR将文件指针向前移动sizeof(index)。

在获得了数据的大小和位置之后,它只剩下获取数据了。

这里使用fsetpos(),因为index.pos的类型是fpos\u t。另一种方法是使用ftell代替fgetpos,使用fsek代替fgetpos。fseek和ftell对使用int,而fgetpos和fsetpos使用fpos\u t。

将记录读入内存后,将附加一个空字符\0以将其转换为正确的c字符串。别忘了,否则你会撞车的。与前面一样,对两个文件都调用fclose。虽然如果忘记fclose(与写操作不同),不会丢失任何数据,但会出现内存泄漏。

  • 发表于 2021-09-27 17:01
  • 阅读 ( 124 )
  • 分类:数学

你可能感兴趣的文章

matlab语言(matlab)和c语言(c language)的区别

...主要在工程界和科学界流行。它为统计和机器学习、信号处理、控制系统、神经网络、图像处理和文本分析提供了几个工具箱。它在研究社区中也很受欢迎,因为它允许在不需要大量编码的情况下轻松地开发算法。总的来说,它...

  • 发布于 2020-10-18 11:32
  • 阅读 ( 243 )

目标c(objective c)和敏捷的(swift)的区别

...函数返回。 在Swift中,不需要像在Objective C中那样使用头文件。Swift提供了许多现代编程语言一样的名称空间。它有助于将代码分隔为名称空间,因此很容易组织代码。Swift得到定期更新,使应用程序健壮和高效。一个流行的版...

  • 发布于 2020-10-19 22:48
  • 阅读 ( 376 )

python(python)和c语言(c language)的区别

...程语言。Python是一种通用语言,用于机器学习、自然语言处理、web开发等等。C语言主要用于与硬件相关的应用程序开发,如操作系统、网络驱动程序等。 下载PythonVSC语言的pdf版本 你可以下载这篇文章的PDF版本,并按照引文说明...

  • 发布于 2020-10-24 05:03
  • 阅读 ( 311 )

用unity编写游戏:初学者指南

...最好的独立游戏,所以一定要查看这些游戏,以获得一些关于Unity等工具可以实现什么的灵感。 ...

  • 发布于 2021-03-13 11:55
  • 阅读 ( 243 )

初学者最容易学习的6种编程语言

... 2016年1月5日,一篇关于Infoworld的文章谈到了Java作为一种语言的重新崛起。 ...

  • 发布于 2021-03-16 10:37
  • 阅读 ( 289 )

excelvba初学者编程教程

...您可能希望创建一个模拟骰子,当您按下按钮时返回一个随机值,这可能是一个更大的游戏的一部分。或者,可以创建一个按钮,将指定单元格的内容与同一文档中其他单元格的内容进行检查。 ...

  • 发布于 2021-03-17 04:40
  • 阅读 ( 232 )

适合初学者的最佳unity 3d教程

...。这些教程将教你一切你需要建立你的梦想游戏!首先,关于名字的注释。 ...

  • 发布于 2021-03-21 15:28
  • 阅读 ( 344 )

如何使用“helloworld”脚本开始使用python

... 更进一步,您甚至可以查看一些在线资源,以了解更多关于python3的功能和可用性的信息。 ...

  • 发布于 2021-03-28 01:18
  • 阅读 ( 315 )

如何在windows上安装python

...你想要的版本取决于你的最终目标。比方说,你读了我们关于用MCDungeon扩展你的Minecraft世界的文章,很高兴能为你的世界添加一些很酷的东西。这个项目是用Python编写的,需要python2.7,不能用python3.6运行MCDungeon项目。事实上,如...

  • 发布于 2021-04-07 13:14
  • 阅读 ( 199 )

我在短短的几个小时内学会了假唱(你也可以)

...两样东西:时间和耐心。 尽管我写了很多年关于deepfakes的文章,但我只使用为我工作的预先打包的应用程序来**它们。但是,当我看到一个明显简单的方法,创造快速唇形同步深假在任何时间,我知道我必须尝试自己...

  • 发布于 2021-04-17 20:33
  • 阅读 ( 179 )
载儿人胜璃ahu
载儿人胜璃ahu

0 篇文章

相关推荐