C语言文件随机读写核心:rewind与fseek定位详解
在实际开发中,顺序读写往往无法满足需求。要实现从文件中间或指定位置开始读写,必须使用定位函数改变文件内部的位置指针。本文解析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值。
参数解析:
- fp:指向目标文件的指针。
- offset:位移量,单位为字节。
- 正值:向后移动;
- 负值:向前移动(通常用于靠近文件末尾)。
采用long类型以支持更大范围的文件偏移。 - 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+)以避免字符转换干扰。
操作步骤演示
以下示例展示了如何保存三组学生信息,并将指针定位至第二个学生的数据块进行读取。
- 定义结构体与缓冲区:建立包含姓名、学号、年龄、成绩的
struct stu数组。 - 打开文件:使用
fopen("demo.txt", "wb+")创建或清空二进制文件,具备读写权限。 - 批量写入:使用循环接收键盘输入,调用
将数据写入磁盘。 - 定位指针:调用
fseek(fp, sizeof(struct stu), SEEK_SET)跳过第一个学生的字节数,使指针指向第二条记录。 - 单次读取:调用
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语言文件定位操作的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













