C语言文件随机读写核心:rewind与fseek定位详解

慢慢来
慢慢来
发布时间:2026-10-13 | 4人浏览过
原创

在实际开发中,顺序读写往往无法满足需求。要实现从文件中间或指定位置开始读写,必须使用定位函数改变文件内部的位置指针。本文解析rewind与fseek函数的原理、参数及使用场景,并通过完整示例演示如何实现文件的随机读写。

文件定位机制概述

前面的文件读写操作多为顺序执行,即从头到尾依次处理数据。但当需要访问文件的特定段落时,必须先移动“位置指针”至目标位置,这一过程称为文件定位。主要涉及两个标准库函数:

第1步:使用rewind重置指针

  • 功能目的:将文件内部的位置指针强制移动到文件开头。
  • 调用原型:void rewind ( FILE *fp );
  • 说明:该函数无返回值,常用于将文件读写状态重置为初始位置,类似于 fseek(fp, 0, SEEK_SET)。

第2步:使用fseek灵活定位指针

  • 功能目的:将位置指针移动到相对于起始点的任意偏移量处。
  • 调用原型:int fseek ( FILE *fp, long offset, int origin );
  • 返回值:成功返回0,失败返回非0值。

参数解析:

  1. fp:指向目标文件的指针。
  2. offset:位移量,单位为字节。
    - 正值:向后移动;
    - 负值:向前移动(通常用于靠近文件末尾)。
    采用 long 类型以支持更大范围的文件偏移。
  3. origin:起始点,规定计算偏移量的参考坐标。C语言预定义了三个宏常量:
起始点名称 宏常量名 数值映射
文件开头 SEEK_SET 0
当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2

示例逻辑:若要将指针移至距离文件开头100个字节处,调用方式为:fseek(fp, 100, 0); 或 fseek(fp, 100, SEEK_SET);。

注意事项:fseek() 在处理文本文件时可能因编码转换导致计算偏差,因此通常推荐在二进制文件中使用,以确保定位精确。

文件的随机读写实战

定位完成后,可结合 fread() 和 fwrite() 等函数进行读写。由于涉及结构体等复杂数据类型,推荐使用二进制模式(如 wb+)以避免字符转换干扰。

操作步骤演示

以下示例展示了如何保存三组学生信息,并将指针定位至第二个学生的数据块进行读取。

  1. 定义结构体与缓冲区:建立包含姓名、学号、年龄、成绩的 struct stu 数组。
  2. 打开文件:使用 fopen("demo.txt", "wb+") 创建或清空二进制文件,具备读写权限。
  3. 批量写入:使用循环接收键盘输入,调用 将数据写入磁盘。
  4. 定位指针:调用 fseek(fp, sizeof(struct stu), SEEK_SET) 跳过第一个学生的字节数,使指针指向第二条记录。
  5. 单次读取:调用 fread(&boy, sizeof(struct stu), 1, fp) 读取当前指针下的数据并存入变量 boy。
#include <stdio.h>
#include <stdlib.h>
#define N 3

// 定义学生结构体
typedef struct {
    char name[10]; //姓名
    int num;       //学号
    int age;       //年龄
    float score;   //成绩
} Student;

int main() {
    Student boys[N], boy;
    FILE *fp;
    
    // 1. 打开文件(二进制读写模式)
    if ((fp = fopen("demo.txt", "wb+")) == NULL) {
        printf("Cannot open file, press any key to exit!\n");
        return 1;
    }

    // 2. 输入并写入数据
    printf("Input data:\n");
    for(int i = 0; i < N; i++) {
        scanf("%s %d %d %f", boys[i].name, &boys[i].num, &boys[i].age, &boys[i].score);
    }
    fwrite(boys, sizeof(Student), N, fp); // 写入三条学生信息
    
    // 3. 定位指针到第二个学生(大小为一个结构体)
    fseek(fp, sizeof(Student), SEEK_SET);
    
    // 4. 读取第二个学生的信息
    fread(&boy, sizeof(Student), 1, fp);
    
    // 5. 输出结果
    printf("Read Second Student: %s  %d  %d %.2f\n", 
           boy.name, boy.num, boy.age, boy.score);

    fclose(fp);
    return 0;
}

运行结果验证

当输入测试数据后,程序将跳过第一条记录,直接打印第二条记录的内容:

Input data:
Tom 2 15 90.5
Hua 1 14 99
Zhao 10 16 95.5
Read Second Student: Hua  1  14 99.00

以上就是关于C语言rewind与fseek函数之随机读写文件的详细内容,更多关于C语言文件定位操作的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表