C语言文件随机读写:fseek与rewind定位及示例

落日邮差
落日邮差
发布时间:2026-10-13 | 5人浏览过
原创

在C语言开发中,若需从文件中间或任意位置读取数据,必须使用随机读写技术。其核心在于利用 fseek 函数移动文件内部的位置指针,指定起始点与偏移量后,即可通过 fread 和 fwrite 对二进制文件进行精准操作。

文件定位原理与关键函数

顺序读写只能从头开始依次处理数据,而随机读写允许程序跳转到文件的任意部分。实现这一功能的关键是“文件定位”,即改变文件流的当前位置指示器(Position Pointer)。

第1步:理解 fseek 函数的参数结构

fseek 用于将位置指针移动到指定位置。其原型如下:

int fseek(FILE *stream, long offset, int origin);
  • stream:指向 FILE 对象的指针,即被操作的文件。
  • offset:相对于 origin 的字节偏移量。类型为 long 以支持大文件。
  • origin:起始参考点,决定了偏移量的计算基准。

第2步:选择正确的起始点常量

C语言定义了三个标准宏来表示 origin 的取值,使用前需包含头文件 stdio.h:

起始点 常量名 数值
文件开头 SEEK_SET 0
当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2

注意:fseek 主要用于二进制文件。在文本文件中,由于换行符转换等原因,计算的位置可能会出现误差。

第3步:使用 rewind 快速返回文件头

若只需将指针移回文件开头,可使用 rewind 函数,其等价于 fseek(stream, 0L, SEEK_SET):

void rewind(FILE *stream);

随机读写操作流程

完成定位后,即可使用标准的 I/O 函数进行读写。对于结构化数据(如结构体),推荐使用二进制模式打开文件,并使用 fread 和 fwrite 以保持内存布局的一致性。

第4步:编写结构体文件读写示例

以下示例演示如何存储学生信息,并跳过第一个学生,直接读取第二个学生的信息。这体现了随机读写的核心价值:无需遍历前文即可获取目标数据。

#include<stdio.h>
#define N 3
struct stu{
  char name[10]; //姓名
  int num; //学号
  int age; //年龄
  float score; //成绩
}boys[N], boy, *pboys;

int main(){
  FILE *fp;
  int i;
  pboys = boys;
  
  // 以二进制读写模式打开文件
  if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){
    printf("Cannot open file, press any key to exit!\n");
    getch();
    exit(1);
  }
  
  printf("Input data:\n");
  for(i=0; i<N; i++,pboys++){
    scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
  }
  
  // 一次性写入所有学生信息
  fwrite(boys, sizeof(struct stu), N, fp);
  
  // 关键步骤:定位到第二个学生的起始位置
  // 跳过第一个学生的sizeof(struct stu)个字节
  fseek(fp, sizeof(struct stu), SEEK_SET);
  
  // 读取一个学生的数据
  fread(&boy, sizeof(struct stu), 1, fp);
  
  // 输出结果
  printf("%s %d %d %f\n", boy.name, boy.num, boy.age, boy.score);
  
  fclose(fp);
  return 0;
}

第5步:验证运行结果

假设输入如下数据:

  • Tom 2 15 90.5
  • Hua 1 14 99
  • Zhao 10 16 95.5

程序执行后,控制台将输出第二个学生的信息:

Hua 1 14 99.000000

常见问题与排错

如果在读取时得到乱码或错误数据,请检查以下几点:

  1. 文件模式错误:确保使用 "rb"(只读二进制)或 "wb+" 等二进制模式,而非文本模式(如 "w")。
  2. 结构体对齐差异:sizeof(struct stu) 的大小取决于编译器和平台。如果读写双方环境不同,需确保结构体内存布局一致(必要时使用 #pragma pack)。
  3. 指针越界:在调用 fseek 后,检查 fread 是否成功读取了预期的字节数。

总结

通过掌握 fseek 的定位技巧,开发者可以高效地处理大型数据文件或需要跳跃式访问的记录系统。避免不必要的顺序扫描,提升I/O效率。

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

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表