C 语言随机访问文件

2024 年 8 月 28 日 | 阅读 9 分钟

引言

在本文中,我们将讨论**随机文件访问**。C 语言的**随机访问文件**使我们能够在磁盘文件中**读取**或**写入**任何数据,而无需先读取或写入它之前的所有数据。我们可以轻松地在**随机访问文件**中查找数据、**编辑**它,甚至**删除**它。**随机访问文件**可以使用与 C 编程中的顺序文件相同的打开方式进行**打开**和**关闭**。尽管如此,随机访问文件需要一些独特的函数。**灵活性、强大性、**和**磁盘访问速度**是这种额外努力的好处。在 C 语言中,可以使用 **ftell()、fseek()** 和 **rewind()** 等函数来进行**随机访问**文件。

访问文件类型

在 C 语言中,存在以下用于访问文件中保存的数据的方法:

  1. 顺序访问
  2. 随机访问

顺序访问

**顺序访问**不是读取文件中部数据的最佳方法,特别是当文件非常大时。**顺序文件**是一种文件组织形式,我们可以连续地保存数据,每个记录都存储在另一个记录之后,并且只能顺序访问数据。在此类文件中,数据从文件**的开头**读取,并按其在文件中的顺序进行处理。它主要适用于数据按顺序处理且不进行随机访问的应用。

随机访问

C 语言中的**随机访问文件**是一种文件类型,它允许我们在磁盘文件中**写入或读取**任何数据,而无需先读取或写入其之前的所有数据部分。在此类文件中,我们可以立即查找数据、修改它,甚至删除或移除它。我们可以像打开顺序文件一样在 C 语言中打开和关闭随机访问文件,但我们需要一些额外的函数来实现此目的。

随机访问文件函数

因此,主要有三个函数可以帮助访问 C 语言中的随机访问文件:

  • ftell()
  • rewind()
  • fseek()

如何使用 C 语言的 ftell() 函数

**文件指针的位置**相对于文件的开头,可以使用**ftell() 函数**来确定。

语法

它具有以下语法:

要确定 C 语言中**文件指针的位置**相对于文件开头的位置,请使用**ftell()**函数。

ftell() 的语法如下:

其中 **pos** 包含**当前位置**或已读取(或写入)的总字节数,而 **fp** 是**文件指针**。例如,如果**ftell() 函数**返回 **5**,而一个文件包含 **20 字节**的数据,则表示**已读取**(或**写入**)**5 字节**。请看以下程序来理解**ftell()**函数:

让我们先看一个名为**Jtp.txt**的文件,其中包含以下信息:**Jtp is best.**

程序

现在让我们看一下 C 代码:

输出

Position pointer in the beginning : 0
Jtp is best.
Size of file in bytes is : 9

说明

我们可以看到,**首先,ftell**返回 **0**,因为指针指向开头;在打印完文件中的所有字符直到**结尾**后,**ftell**现在返回 **9**,因为这是文件的大小。

如何使用 C 语言的 rewind() 函数

**文件指针**可以使用**rewind() 函数**移动到**文件的开头**。当需要更新文件时,这很有用。

语法

它具有以下语法:

在这种情况下,**fp**是 **FILE 类型**的**文件指针**。要理解**rewind() 方法**,请看以下程序:

程序

输出

Position of the pointer : 0
Jtp is best.
Position of the pointer : 9
Position of the pointer : 0

说明

在这个例子中,我们可以看到,第一次调用**ftell**时,它返回**0**,因为指针位于文件开头;第二次在**遍历**完文件后调用**ftell**时,它返回**17**,这是**文件的大小**。现在,当调用**rewind(fp)**时,指针将返回到其**初始位置**,即**0**。因此,最后的**ftell**返回 0。

如何使用 C 语言的 fseek() 函数

**fseek() 函数**用于将**文件位置**移动到指定位置。

语法

语法是

各组成部分如下:

**fp** - **文件指针**。

**displacement** - 它表示从**第三个参数指定**的位置向前或向后跳过的**字节数**。**此长整型**有两个可能的值:**正数**和**负数**。

**origin** - 它是相对于某个位置的起点。它将接受以下三个值。

Constant位置
SEEK_SET0文件开头
SEEK_CURRENT1当前位置
SEEK_END2文件结尾

以下是我们可以使用**fseek() 函数**执行的**典型操作**列表:

操作描述
fseek(fp, 0, 0)这会将我们带到文件开头。
fseek(fp, 0, 2)这会将我们带到文件结尾。
fseek(fp, N, 0)现在,我们位于文件的**(N + 1)th** 字节。
fseek(fp, N, 1)它使我们在当前位置向前移动文件 **N 字节**。
fseek(fp, -N, 1)它使我们在当前位置向后移动文件 **N 字节**。
fseek(fp, -N, 2)它使我们从文件末尾位置向前移动 **N 字节**。

让我们看下面的程序以更好地理解**fseek() 方法**:

输出

Is best.

说明

当我们**遍历**该位置的文件时,我们会得到一个令人惊讶的输出。我们可以看到,当我们调用**fseek(fp,6,0)**时,指针会移动到文件中的**第 7 个**字节,即从开头向前移动**6 字节**。

识别文件中的特定记录

如果我们知道**记录的大小**以及它在文件中的开始位置,我们可以使用**fseek() 方法**来定位它。要从数据文件中获取任何所需的记录,需要了解两件事:

  1. 数据在文件中的起始位置。
  2. 数据的大小

由于我们已经知道了记录的长度,因此我们可以使用**fseek()**将文件指针重新定位到记录开始的位置,并使用另一个指针指向记录的结束位置。

以不同的文件模式读取和写入文件

单个字母**"r"、"b"、"w"、"a"**和**"+"**与其它字母组合,生成多个文件**模式说明符**,用于读取和写入文件。

打开文件时,您需要指定文件的**打开方式**,包括是追加还是从头创建,是**文本**模式还是**二进制**模式,以及是读取还是写入。通过将单个字母**"r"、"b"、"w"、"a"**和**"+"**与其它字母组合,可以生成一个或多个文件模式说明符,具体操作方式如下。让我们看看它们:

r -

它允许您**读取**文件。如果文件丢失或找不到,它将**失败**。

w -

它表示创建一个**新**的或**空文件**用于写入。如果文件中存在任何数据,它将被销毁。

a -

如果文件不存在,它会先创建它,然后以追加模式(在末尾写入)打开它,而不会删除**EOF 标记**。

通过向文件模式追加**"+"**,我们可以添加另外三种模式:

r+ -

它允许**读取**文件并**写入**文件。

w+ -

因此,该文件以**空**状态**打开**,并准备好进行写入和读取。如果文件中存在任何数据,它将被销毁。

a+ -

它使文件**可访问**以进行**读取**和追加。在追加过程中,必须先删除**EOF 标记**才能向文件添加新数据,并在写入完成后恢复。如果文件不存在,它将首先被创建。

文件模式组合

**文件模式**的组合允许同时进行**读取**和**写入**操作。一般来说,您一次只能**读取**或**写入**一个文本文件。二进制文件允许同时进行读取和写入。下表概述了每个组合的功能:

组合 (Combination)文件类型操作
rtext读取
rb+binary读取
r+text读取,写入
r+bbinary读取,写入
rb+binary读取,写入
wtext写入,创建,截断
wbbinary写入,创建,截断
w+text读取,写入,创建,截断
w+bbinary读取,写入,创建,截断
wb+binary读取,写入,创建,截断
atext写入,创建
abbinary写入,创建
a+text读取,写入,创建
a+bbinary写入,创建
ab+binary写入,创建

如何创建随机访问文件

如果文件不存在,可以使用**fopen()**等函数创建。以下示例展示了这一点:

程序

输出

File created successfully!

随机向随机访问文件写入数据

该程序将数据写入**"student.txt"**文件。它使用**fseek()**和**fwrite()**的组合将数据保存在文件中的特定位置。**Fseek()**将文件位置指针设置到文件中的特定位置,然后**fwrite()**将内容写入文件。请看下面的代码:

程序

输出

Enter roll number from (1 to 100) , -1 to end input : 1
Enter name :Jtp
Enter roll number from (1 to 100) , -1 to end input : 10
Enter name : Suman
Enter roll number from (1 to 100) , -1 to end input : -1

结论

  1. 在随机访问文件中,我们可以在 C 语言中**读取**或**写入**磁盘文件中的任何数据,而无需先**读取**或**写入**它之前的所有数据。
  2. **文件指针的位置**相对于文件的开头,可以使用**ftell() 函数**来确定。
  3. **文件指针**可以使用**rewind() 函数**移动到文件的开头。
  4. **文件位置**使用**fseek() 函数**移动到相应的位置。
  5. 如果我们知道记录的大小以及它在文件中的起始位置,我们可以使用**fseek() 方法**来定位它。
  6. 单个字母**"r"、"b"、"w"、"a"**和**"+"**与其它字母组合,生成多个文件模式说明符,用于读取和写入文件。
  7. **文件模式**的组合允许同时进行读取和写入操作。