随机访问文件的操作

发布:2024-09-24 13:53 阅读:92 点赞:0

一. 引言

随机访问文件(或直接访问文件)指的是能够将文件指针移动到文件的任何位置,从而在特定位置进行读取或写入,而无需按顺序读取整个文件。这在需要修改或检索文件中任意位置的数据时非常有用。通过使用标准函数,我们可以在文件中向前或向后移动,以模拟随机访问。

二. 移动文件指针的函数

在 C 语言中,有几个函数可以用于移动文件指针,这些函数包括:

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

1. fseek()

fseek() 函数可用于在文件中向前或向后移动。

fseek() 的语法

fseek(<file pointer>, <offset>, <position>);
  • file pointer:指向已打开的文件的指针。文件可以以读模式或写模式打开。
  • offset:要从当前文件位置移动的字节数,可以是正值(向前移动)或负值(向后移动)。
  • position:表示要移动的起始位置,可以取以下三个值:
    • 0:从文件开头开始移动。
    • 1:从当前文件位置移动。
    • 2:从文件末尾开始移动。

使用 fseek() 的示例代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void main() {
    FILE *file_pointer;  // 声明文件指针
    long int firstno;    // 声明一个长整型变量

    clrscr();  // 清屏
    printf("这是 Shikha Tiwari 的程序,演示 fseek() 和 ftell() 函数在 C 中的用法\n\n");

    // 打开文件,如果失败则退出
    if ((file_pointer = fopen("accounts.dat""r")) == NULL) {
        printf("无法打开 accounts.dat 文件,程序终止 .......\n");
        exit(1);
    }

    // 输出当前偏移量
    printf("1. 当前文件偏移量为 %ld \n", ftell(file_pointer));
    
    // 从文件开头移动10个字节
    fseek(file_pointer, 10, SEEK_SET);
    printf("2. 当前文件偏移量为 %ld \n", ftell(file_pointer));
    
    // 从当前偏移量再移动10个字节
    fseek(file_pointer, 10, SEEK_CUR);
    printf("3. 当前文件偏移量为 %ld \n", ftell(file_pointer));
    
    // 从文件末尾向前移动10个字节
    fseek(file_pointer, -10, SEEK_END);
    printf("4. 当前文件偏移量为 %ld \n", ftell(file_pointer));
    
    // 重置到文件开头并再移动10个字节
    fseek(file_pointer, 10, SEEK_SET);
    printf("5. 当前文件偏移量为 %ld \n", ftell(file_pointer));
    
    // 重置到文件开头
    fseek(file_pointer, 0L, SEEK_SET);
    printf("6. 当前文件偏移量为 %ld \n", ftell(file_pointer));
    
    // 移动到文件末尾
    fseek(file_pointer, 0L, SEEK_END);
    printf("7. 当前文件偏移量为 %ld \n", ftell(file_pointer));

    fclose(file_pointer);  // 关闭文件
    getch();  // 等待用户输入
}

输出

运行上述代码后,您将看到当前文件偏移量的变化。

2. ftell()

ftell() 函数用于返回当前文件位置的偏移量。该函数返回一个长整型值,可以用来获取从文件开头到当前位置的字节数。

ftell() 的语法

<long variable> = ftell(<file pointer>);
  • long variable:将存储相对位置的长整型变量,它给出当前文件位置的偏移量(以字节为单位)。

3. rewind()

rewind() 函数用于将文件指针移动到文件的第一个字节,即从文件的任何位置移动到文件的开头。

rewind() 的语法

rewind(<file pointer>);
  • file pointer:用于访问文件的指针。

使用 rewind() 的示例代码

#include <stdio.h>
#include <conio.h>

void main() {
    FILE *file_pointer;  // 声明文件指针
    char text_to_read_write[80];  // 用于读取和写入文本的数组

    clrscr();  // 清屏
    printf("这是 Shikha Tiwari 的程序,演示 rewind() 函数在 C 中的用法\n\n");
    
    // 打开文件,如果失败则退出
    if ((file_pointer = fopen("accounts.dat""r")) == NULL) {
        printf("无法打开 accounts.dat 文件,程序终止 .......\n");
        exit(1);
    }

    printf("以下是文件中的文本:\n");
    while (!feof(file_pointer)) {
        fgets(text_to_read_write, 80, file_pointer);  // 读取文件中的文本
        puts(text_to_read_write);  // 输出文本
    }
    
    // 输出当前偏移量
    printf("当前文件偏移量为 %1d \n", ftell(file_pointer));
    printf("此时,文件末尾已到达,现在使用 rewind() \n");
    
    rewind(file_pointer);  // 重置文件指针到开头
    printf("使用 rewind() 后,文件中的文本为:\n");
    while (!feof(file_pointer)) {
        fgets(text_to_read_write, 80, file_pointer);  // 再次读取文件中的文本
        puts(text_to_read_write);  // 输出文本
    }
    
    // 输出当前偏移量
    printf("当前文件偏移量为 %1d \n", ftell(file_pointer));

    fclose(file_pointer);  // 关闭文件
    getch();  // 等待用户输入
}

输出

运行上述代码后,您将看到文件文本的输出情况,以及重置指针后的效果。

三. 总结

随机访问文件的能力使得我们能够在文件的任意位置直接读取或写入,而无需按顺序处理文件。这对于从任意部分修改或检索数据尤为重要。fseek() 函数帮助我们移动指针到指定位置,ftell() 用于获取当前指针位置,rewind() 则重置指针到文件的开头。这些函数使得文件数据的操作更加高效灵活。