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

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

在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。